Example #1
0
 internal ListWriteContract(Type type, ContractCollection contractCollection)
 {
     if (!CanProcess(type))
     {
         throw new ArgumentException($"Type {type} must be {nameof(IReadOnlyList<int>)}<>.", nameof(type));
     }
     ItemContract = contractCollection.GetOrAddWriteContract(type.GetGenericArguments().Single());
 }
Example #2
0
 internal NullableWriteContract(Type type, ContractCollection contractCollection)
 {
     if (!CanProcess(type))
     {
         throw new ArgumentException($"Type {type} must be nullable.", nameof(type));
     }
     Inner = contractCollection.GetOrAddWriteContract(Nullable.GetUnderlyingType(type));
 }
Example #3
0
 internal DictionaryWriteContract(Type type, ContractCollection contractCollection)
 {
     if (!CanProcess(type))
     {
         throw new ArgumentException($"Type {type} must be {nameof(IReadOnlyDictionary<int, int>)}<,>.", nameof(type));
     }
     KeyContract   = contractCollection.GetOrAddWriteContract(type.GetGenericArguments()[0]);
     ValueContract = contractCollection.GetOrAddWriteContract(type.GetGenericArguments()[1]);
 }
Example #4
0
        /// <inheritdoc />
        public bool CanReadFrom(IWriteContract writeContract, bool strict)
        {
            if (!(writeContract is EnumContract that))
            {
                return(false);
            }

            return(strict
                ? _memberNames.SetEquals(that.MemberNames)
                : _memberNames.IsSupersetOf(that.MemberNames));
        }
Example #5
0
 internal Field(string name, IWriteContract contract)
 {
     Name     = name;
     Contract = contract;
 }
Example #6
0
 internal NullableWriteContract(IWriteContract inner) => Inner = inner;
Example #7
0
 internal ListWriteContract(IWriteContract itemContract) => ItemContract = itemContract;
Example #8
0
 internal Member(string id, IWriteContract contract)
 {
     Id       = id;
     Contract = contract;
 }
Example #9
0
 /// <inheritdoc />
 public bool CanReadFrom(IWriteContract writeContract, bool strict) => writeContract is EmptyContract || !strict;
Example #10
0
 internal DictionaryWriteContract(IWriteContract keyContract, IWriteContract valueContract)
 {
     KeyContract   = keyContract;
     ValueContract = valueContract;
 }
Example #11
0
 /// <inheritdoc />
 public bool CanReadFrom(IWriteContract writeContract, bool strict)
 {
     return(writeContract is DictionaryWriteContract ws &&
            KeyContract.CanReadFrom(ws.KeyContract, strict) &&
            ValueContract.CanReadFrom(ws.ValueContract, strict));
 }
Example #12
0
 /// <inheritdoc />
 public bool CanReadFrom(IWriteContract writeContract, bool strict) => Equals(writeContract);
Example #13
0
        public bool TryResolveWriteContract(string str, out IWriteContract writeContract)
        {
            if (!AllowResolution)
            {
                throw new InvalidOperationException("Cannot resolve contract at this stage. Use a bind action instead.");
            }

            if (str.StartsWith("#"))
            {
                var id = str.Substring(1);
                writeContract = Contracts.OfType <ByRefContract>().SingleOrDefault(s => s.Id == id) as IWriteContract;
                return(writeContract != null);
            }

            if (str.StartsWith("{"))
            {
                var tokens = ContractMarkupExtension.Tokenize(str).ToList();

                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (tokens.Count)
                {
                case 1:
                    if (tokens[0] == "empty")
                    {
                        writeContract = Intern(new EmptyContract());
                        return(true);
                    }
                    break;

                case 2:
                    if (tokens[0] == "nullable")
                    {
                        if (TryResolveWriteContract(tokens[1], out IWriteContract inner))
                        {
                            writeContract = Intern(new NullableWriteContract(inner));
                            return(true);
                        }
                    }
                    else if (tokens[0] == "list")
                    {
                        if (TryResolveWriteContract(tokens[1], out IWriteContract itemContract))
                        {
                            writeContract = Intern(new ListWriteContract(itemContract));
                            return(true);
                        }
                    }
                    break;

                case 3:
                    if (tokens[0] == "dictionary")
                    {
                        if (TryResolveWriteContract(tokens[1], out IWriteContract keyContract) && TryResolveWriteContract(tokens[2], out IWriteContract valueContract))
                        {
                            writeContract = Intern(new DictionaryWriteContract(keyContract, valueContract));
                            return(true);
                        }
                    }
                    break;
                }

                if (tokens.Count != 0 && tokens[0] == "tuple")
                {
                    var itemContracts = new List <IWriteContract>();
                    foreach (var token in tokens.Skip(1))
                    {
                        if (!TryResolveWriteContract(token, out IWriteContract itemContract))
                        {
                            writeContract = null;
                            return(false);
                        }
                        itemContracts.Add(itemContract);
                    }
                    writeContract = Intern(new TupleWriteContract(itemContracts));
                    return(true);
                }

                writeContract = null;
                return(false);
            }

            writeContract = Intern(new PrimitiveContract(str));
            return(true);
        }
Example #14
0
 /// <summary>
 /// Produced a reference string for <paramref name="contract"/>.
 /// </summary>
 /// <remarks>
 /// For more information on monikers, read the documentation of <see cref="ContractCollection"/>.
 /// </remarks>
 /// <param name="contract">The contract to return a reference string for.</param>
 /// <returns>The reference string.</returns>
 public static string ToReferenceString(this IWriteContract contract) => ToReferenceStringInternal(contract);