Exemple #1
0
        private IValueNode ReplaceVariable(
            VariableNode variable,
            IInputType type)
        {
            if (_variables.TryGetVariable(
                    variable.Name.Value,
                    out object v))
            {
                if (!type.ClrType.IsInstanceOfType(v) &&
                    !_typeConversion.TryConvert(
                        typeof(object),
                        type.ClrType,
                        v,
                        out v))
                {
                    // TODO : resource
                    // TODO : path?
                    throw new QueryException(
                              ErrorBuilder.New()
                              .SetMessage(
                                  "Unable to convert the specified " +
                                  "variable value.")
                              .Build());
                }

                return(type.ParseValue(v));
            }

            return(type.ParseValue(null));
        }
        private static bool TryConvertLeafValue(
            ITypeConversion converter,
            IHasClrType leafType,
            object value,
            out object scalarValue)
        {
            try
            {
                if (value is null)
                {
                    scalarValue = value;
                    return(true);
                }

                if (!leafType.ClrType.IsInstanceOfType(value))
                {
                    return(converter.TryConvert(
                               typeof(object),
                               leafType.ClrType,
                               value,
                               out scalarValue));
                }

                scalarValue = value;
                return(true);
            }
            catch
            {
                scalarValue = null;
                return(false);
            }
        }
        protected override void VisitObjectField(
            ObjectFieldNode node,
            ConverterContext context)
        {
            if (context.InputFields.TryGetField(
                    node.Name.Value, out InputField inputField))
            {
                var valueContext = new ConverterContext();
                valueContext.InputType = inputField.Type;
                valueContext.ClrType   = inputField.ClrType;

                VisitValue(node.Value, valueContext);

                object value = (inputField.ClrType != null &&
                                !inputField.ClrType
                                .IsInstanceOfType(valueContext.Object) &&
                                _converter.TryConvert(
                                    typeof(object), inputField.ClrType,
                                    valueContext.Object, out object obj))
                    ? obj
                    : valueContext.Object;

                inputField.SetValue(context.Object, value);
            }
        }
        internal object DeserializeArgument(
            Argument argument,
            IValueNode valueNode,
            Type targetType)
        {
            if (argument == null)
            {
                throw new ArgumentNullException(nameof(argument));
            }

            if (valueNode == null)
            {
                throw new ArgumentNullException(nameof(valueNode));
            }

            var obj = argument.Type.ParseLiteral(valueNode);

            if (targetType.IsInstanceOfType(obj))
            {
                return(obj);
            }

            if (_converter.TryConvert(typeof(object), targetType,
                                      obj, out var o))
            {
                return(o);
            }

            throw new ArgumentException(
                      TypeResources.DirectiveType_UnableToConvert,
                      nameof(targetType));
        }
        private object Serialize(ExportedVariable exported, ITypeNode type)
        {
            if (_executor.Schema.TryGetType(
                    type.NamedType().Name.Value,
                    out INamedInputType inputType) &&
                _typeConversion.TryConvert(
                    typeof(object),
                    inputType.ClrType,
                    exported.Value,
                    out var converted))
            {
                return(inputType.Serialize(converted));
            }

            throw SerializationError();
        }
        private IValueNode ReplaceVariable(
            VariableNode variable,
            IInputType type)
        {
            if (_variables.TryGetVariable(
                    variable.Name.Value,
                    out object v))
            {
                if (!type.ClrType.IsInstanceOfType(v) &&
                    !_typeConversion.TryConvert(
                        typeof(object),
                        type.ClrType,
                        v,
                        out v))
                {
                    throw new QueryException(
                              ErrorBuilder.New()
                              .SetMessage(CoreResources.VarRewriter_CannotConvert)
                              .SetCode(ErrorCodes.Utilities.NoConverter)
                              .AddLocation(variable)
                              .Build());
                }

                return(type.ParseValue(v));
            }

            return(type.ParseValue(null));
        }
Exemple #7
0
        private static IError CheckForNullFieldViolation(
            InputObjectType type,
            object value,
            ISet <object> processed,
            ITypeConversion converter,
            Func <string, IError> createError)
        {
            if (!processed.Add(value))
            {
                return(null);
            }

            foreach (InputField field in type.Fields)
            {
                object obj = (type.ClrType != null &&
                              !type.ClrType.IsInstanceOfType(value) &&
                              converter.TryConvert(typeof(object), type.ClrType,
                                                   value, out object converted))
                    ? converted
                    : value;

                object fieldValue = field.GetValue(obj);
                IError error      = CheckForNullValueViolation(
                    field.Type, fieldValue, processed,
                    converter, createError);

                if (error != null)
                {
                    return(error);
                }
            }

            return(null);
        }
Exemple #8
0
        protected static bool TryConvertSerialized <T>(
            object serialized,
            ValueKind expectedKind,
            out T value)
        {
            if (Scalars.TryGetKind(serialized, out ValueKind kind) &&
                kind == expectedKind &&
                _converter.TryConvert <object, T>(serialized, out T c))
            {
                value = c;
                return(true);
            }

            value = default;
            return(false);
        }
        private void VisitValue(
            object obj,
            Action <object> setValue,
            ISet <object> processed)
        {
            if (obj is null)
            {
                setValue(null);
                return;
            }

            switch (obj)
            {
            case string _:
            case short _:
            case ushort _:
            case int _:
            case uint _:
            case long _:
            case ulong _:
            case float _:
            case double _:
            case decimal _:
            case bool _:
                setValue(obj);
                return;
            }

            Type type = obj.GetType();

            if (type.IsValueType && _converter.TryConvert(
                    type, typeof(string), obj, out object converted) &&
                converted is string s)
            {
                setValue(s);
                return;
            }
            else if (!typeof(IReadOnlyDictionary <string, object>).IsAssignableFrom(type) &&
                     obj is ICollection list)
            {
                VisitList(list, setValue, processed);
            }
            else
            {
                VisitObject(obj, setValue, processed);
            }
        }
        public static bool TryConvert <TFrom, TTo>(
            this ITypeConversion typeConversion,
            TFrom source, out TTo converted)
        {
            if (typeConversion == null)
            {
                throw new ArgumentNullException(nameof(typeConversion));
            }

            if (typeConversion.TryConvert(
                    typeof(TFrom), typeof(TTo),
                    source, out object conv) &&
                conv is TTo convcasted)
            {
                converted = convcasted;
                return(true);
            }

            converted = default;
            return(false);
        }
Exemple #11
0
        private IValueNode ParseValue(object value, ISet <object> set)
        {
            if (value is null)
            {
                return(NullValueNode.Default);
            }

            switch (value)
            {
            case string s:
                return(new StringValueNode(s));

            case short s:
                return(new IntValueNode(s));

            case ushort s:
                return(new IntValueNode(s));

            case int i:
                return(new IntValueNode(i));

            case uint i:
                return(new IntValueNode(i));

            case long l:
                return(new IntValueNode(l));

            case ulong l:
                return(new IntValueNode(l));

            case float f:
                return(new FloatValueNode(f));

            case double d:
                return(new FloatValueNode(d));

            case decimal d:
                return(new FloatValueNode(d));

            case bool b:
                return(new BooleanValueNode(b));
            }

            Type type = value.GetType();

            if (type.IsValueType && _converter.TryConvert(
                    type, typeof(string), value, out object converted) &&
                converted is string c)
            {
                return(new StringValueNode(c));
            }

            if (set.Add(value))
            {
                if (value is IReadOnlyDictionary <string, object> dict)
                {
                    var fields = new List <ObjectFieldNode>();
                    foreach (KeyValuePair <string, object> field in dict)
                    {
                        fields.Add(new ObjectFieldNode(
                                       field.Key,
                                       ParseValue(field.Value, set)));
                    }
                    return(new ObjectValueNode(fields));
                }

                if (value is IReadOnlyList <object> list)
                {
                    var valueList = new List <IValueNode>();
                    foreach (object element in list)
                    {
                        valueList.Add(ParseValue(element, set));
                    }
                    return(new ListValueNode(valueList));
                }

                return(ParseValue(_objectToDictConverter.Convert(value), set));
            }

            // TODO : resources
            throw new ScalarSerializationException(
                      "Cycle in object graph detected.");
        }