示例#1
0
        private GraphQLException ComposeError(GraphQLArgument argument, GraphQLValue astValue, IEnumerable <GraphQLException> innerExceptions)
        {
            var innerMessage     = string.Join("\n", innerExceptions.Select(e => e.Message));
            var exceptionMessage = $"Argument \"{argument.Name.Value}\" has invalid value {astValue}.\n{innerMessage}";

            return(new GraphQLException(exceptionMessage, new[] { argument.Value }));
        }
 public override object ParseLiteral(GraphQLValue value)
 {
     return(value switch
     {
         GraphQLStringValue s => Convert.FromBase64String((string)s.Value), // string conversion for NET48
         _ => throw new NotSupportedException()
     });
示例#3
0
        public override object ParseLiteral(GraphQLValue value)
        {
            if (value is GraphQLNullValue)
            {
                return(null);
            }

            if (value is GraphQLStringValue stringValue)
            {
                return(ParseValue(stringValue.Value));
            }

            if (value is GraphQLObjectValue objectValue)
            {
                var entries = objectValue.Fields.ToDictionary(x => x.Name.Value, x => _floatScalar.ParseLiteral(x.Value));
                if (entries.Count != 3)
                {
                    return(ThrowLiteralConversionError(value));
                }
                var x = (double)entries["x"];
                var y = (double)entries["y"];
                var z = (double)entries["z"];
                return(new Vector3((float)x, (float)y, (float)z));
            }

            return(ThrowLiteralConversionError(value));
        }
示例#4
0
    public void ToAST_Test(IGraphType type, object value, GraphQLValue expected)
    {
        var actual = type.ToAST(value).Print();
        var result = expected.Print();

        actual.ShouldBe(result);
    }
        internal IEnumerable <GraphQLException> IsValid(GraphQLBaseType type, GraphQLValue astValue)
        {
            if (astValue is GraphQLVariable)
            {
                return new GraphQLException[] { }
            }
            ;

            if (astValue is GraphQLNullValue || astValue == null)
            {
                return(this.ValidateNullType(type, astValue));
            }

            if (type is GraphQLNonNull)
            {
                return(this.IsValid(((GraphQLNonNull)type).UnderlyingNullableType, astValue));
            }

            if (type is GraphQLList)
            {
                return(this.ValidateListType(type, astValue));
            }

            if (type is GraphQLInputType)
            {
                return(this.ValidateInputType(type, astValue));
            }

            return(new GraphQLException[] { });
        }
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind == ASTNodeKind.BooleanValue)
            {
                return(new Result(((GraphQLScalarValue)astValue).Value.ParseBoolOrGiveNull()));
            }

            return(Result.Invalid);
        }
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind == ASTNodeKind.StringValue)
            {
                return(new Result(((GraphQLScalarValue)astValue).Value));
            }

            return(Result.Invalid);
        }
示例#8
0
 private static GraphQLObjectField GetObjectField(GraphQLValue value)
 {
     return(new GraphQLObjectField()
     {
         Name = new GraphQLName()
         {
             Value = "fieldA"
         },
         Value = value
     });
 }
示例#9
0
        private GraphQLValue GetDefaultConstantValue()
        {
            GraphQLValue defaultValue = null;

            if (this.Skip(TokenKind.EQUALS))
            {
                defaultValue = this.ParseConstantValue();
            }

            return(defaultValue);
        }
示例#10
0
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (this.UnderlyingNullableType is GraphQLInputType)
            {
                var result = ((GraphQLInputType)this.UnderlyingNullableType).GetFromAst(astValue, schemaRepository);

                return(result.Value != null ? result : Result.Invalid);
            }

            return(Result.Invalid);
        }
示例#11
0
        private IEnumerable GetListValue(GraphQLValue value)
        {
            IList output = new List <object>();
            var   list   = ((GraphQLValue <IEnumerable <GraphQLValue> >)value).Value;

            foreach (var item in list)
            {
                output.Add(this.GetValue(item));
            }

            return(output);
        }
示例#12
0
    public override object ParseLiteral(GraphQLValue value)
    {
        if (value is GraphQLStringValue stringValue)
        {
            if (stringValue.Value.Equals("SerializedValue"))
            {
                return("DeserializedValue");
            }
        }

        return(null);
    }
示例#13
0
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind == ASTNodeKind.FloatValue || astValue.Kind == ASTNodeKind.IntValue)
            {
                var value = ((GraphQLScalarValue)astValue).Value.ParseFloatOrGiveNull();
                if (value != null)
                {
                    return(new Result(value));
                }
            }

            return(Result.Invalid);
        }
示例#14
0
    public void parse_literal_value_to_identifier(object value)
    {
        GraphQLValue ast = value switch
        {
            int i => new GraphQLIntValue(i),
            long l => new GraphQLIntValue(l),
            string s => new GraphQLStringValue(s),
            _ => null
        };
        var ret = _type.ParseLiteral(ast);

        ret.ShouldBeOfType(value.GetType());
        ret.ShouldBe(value);
    }
示例#15
0
        private Object GetArgumentValue(IEdmTypeReference typeReference, GraphQLValue graphValue)
        {
            if (graphValue is GraphQLScalarValue scalarValue)
            {
                if (typeReference.IsString())
                {
                    return(scalarValue.Value);
                }

                return(ODataUriUtils.ConvertFromUriLiteral(scalarValue.Value, ODataVersion.V4, _edmModel, typeReference));
            }

            throw new NotSupportedException("argument " + graphValue.GetType().Name + " not supported");
        }
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind != ASTNodeKind.EnumValue)
            {
                return(Result.Invalid);
            }

            string value = ((GraphQLScalarValue)astValue).Value;

            if (!Enum.IsDefined(this.SystemType, value))
            {
                return(Result.Invalid);
            }

            return(new Result(Enum.Parse(this.SystemType, value)));
        }
示例#17
0
        public void GetValue_GraphQLObjectValueWithIntField_ReturnsExpandoObjectWithIntegerField()
        {
            var literalValue = new GraphQLValue <int>(ASTNodeKind.IntValue);

            this.typeTranslator.GetLiteralValue(literalValue).Returns(123);

            var value = new GraphQLObjectValue()
            {
                Fields = new GraphQLObjectField[] {
                    GetObjectField(literalValue)
                }
            };

            var result = this.valueResolver.GetValue(value) as dynamic;

            Assert.AreEqual(123, result.fieldA);
        }
示例#18
0
    public void parseLiteral_other_fail(Type graphType, object value)
    {
        GraphQLValue astValue = value switch
        {
            int i => new GraphQLIntValue(i),
            long l => new GraphQLIntValue(l),
            bool b => b ? new GraphQLTrueBooleanValue() : new GraphQLFalseBooleanValue(),
            double d => new GraphQLFloatValue(d),
            string s => new GraphQLStringValue(s),
            _ => null
        };

        var g = Create(graphType);

        Should.Throw <Exception>(() => g.ParseLiteral(astValue));
        g.CanParseLiteral(astValue).ShouldBeFalse();
    }
示例#19
0
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind == ASTNodeKind.IntValue)
            {
                decimal value;
                if (!decimal.TryParse(((GraphQLScalarValue)astValue).Value, out value))
                {
                    return(Result.Invalid);
                }

                if (value <= int.MaxValue && value >= int.MinValue)
                {
                    return(new Result(Convert.ToInt32(value)));
                }
            }

            return(Result.Invalid);
        }
示例#20
0
        private Object GetArgumentValue(IEdmTypeReference typeReference, GraphQLValue graphValue)
        {
            if (graphValue is GraphQLScalarValue scalarValue)
            {
                if (typeReference.IsString())
                {
                    return(scalarValue.Value);
                }

                return(ODataUriUtils.ConvertFromUriLiteral(scalarValue.Value, ODataVersion.V4, _edmModel, typeReference));
            }
            else if (graphValue is GraphQLVariable variable)
            {
                Type clrType = _edmModel.GetClrType(typeReference.Definition);
                return(_context.GetArgument(clrType, variable.Name.Value));
            }

            throw new NotSupportedException("Argument " + graphValue.GetType().Name + " not supported");
        }
示例#21
0
    public void parseLiteral_other_ok(Type graphType, object value, object parsed)
    {
        GraphQLValue astValue = value switch
        {
            int i => new GraphQLIntValue(i),
            long l => new GraphQLIntValue(l),
            bool b => b ? new GraphQLTrueBooleanValue() : new GraphQLFalseBooleanValue(),
            double f => new GraphQLFloatValue(f),
            string s => new GraphQLStringValue(s),
            _ => null
        };

        var g   = Create(graphType);
        var ret = g.ParseLiteral(astValue);

        ret.ShouldBeOfType(parsed.GetType());
        ret.ShouldBe(parsed);
        g.CanParseLiteral(astValue).ShouldBeTrue();
    }
示例#22
0
        public object GetValue(GraphQLValue value)
        {
            var literalValue = this.typeTranslator.GetLiteralValue(value);

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

            switch (value.Kind)
            {
            case ASTNodeKind.ListValue: return(this.GetListValue(value));

            case ASTNodeKind.Variable: return(this.variableResolver.GetValue((GraphQLVariable)value));

            case ASTNodeKind.ObjectValue: return(this.CreateObjectFromObjectValue((GraphQLObjectValue)value));

            default: throw new NotImplementedException($"Unknown kind {value.Kind}");
            }
        }
示例#23
0
        public Result GetFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (!(this is GraphQLNonNull) && (astValue == null || astValue.Kind == ASTNodeKind.NullValue))
            {
                return(new Result(null));
            }

            if (astValue?.Kind == ASTNodeKind.Variable)
            {
                var result = schemaRepository.VariableResolver.GetValue((GraphQLVariable)astValue);

                if (result.Value == null && this is GraphQLNonNull)
                {
                    return(Result.Invalid);
                }

                return(result);
            }

            return(this.GetValueFromAst(astValue, schemaRepository));
        }
示例#24
0
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (astValue.Kind == ASTNodeKind.NullValue)
            {
                return(new Result(null));
            }

            var inputType = this.MemberType as GraphQLInputType;
            var output    = CreateOutputList(inputType, schemaRepository);

            if (astValue.Kind != ASTNodeKind.ListValue)
            {
                var value = inputType.GetFromAst(astValue, schemaRepository);

                if (!value.IsValid)
                {
                    return(Result.Invalid);
                }

                output.Add(value.Value);

                return(new Result(output));
            }

            var list = ((GraphQLListValue)astValue).Values;

            foreach (var item in list)
            {
                var result = inputType.GetFromAst(item, schemaRepository);

                if (!result.IsValid)
                {
                    return(Result.Invalid);
                }

                output.Add(result.Value);
            }

            return(new Result(output));
        }
        public override Result GetValueFromAst(GraphQLValue astValue, ISchemaRepository schemaRepository)
        {
            if (!(astValue is GraphQLObjectValue))
            {
                return(Result.Invalid);
            }

            var objectAstValue = (GraphQLObjectValue)astValue;
            var result         = new T();

            foreach (var field in this.Fields)
            {
                var    astField = GetFieldFromAstObjectValue(objectAstValue, field.Key);
                Result fieldResult;

                if (astField == null && field.Value.DefaultValue.IsSet)
                {
                    fieldResult = new Result(field.Value.DefaultValue.Value);
                }
                else
                {
                    fieldResult = this.GetField(astField, field.Value, schemaRepository);
                }

                if (!fieldResult.IsValid)
                {
                    return(Result.Invalid);
                }

                if (fieldResult.Value == null && field.Value.DefaultValue.IsSet)
                {
                    fieldResult = new Result(field.Value.DefaultValue.Value);
                }

                this.AssignValueToObjectField(result, field.Value, fieldResult.Value);
            }

            return(new Result(result));
        }
示例#26
0
        protected EqualsValueClauseSyntax GetDefault(GraphQLValue defaultValue, TypeSyntax type)
        {
            switch (defaultValue?.Kind)
            {
            case ASTNodeKind.IntValue:
                return(SyntaxFactory.EqualsValueClause(
                           SyntaxFactory.LiteralExpression(
                               SyntaxKind.NumericLiteralExpression,
                               SyntaxFactory.ParseToken(((GraphQLScalarValue)defaultValue).Value))));

            case ASTNodeKind.FloatValue:
                return(SyntaxFactory.EqualsValueClause(
                           SyntaxFactory.LiteralExpression(
                               SyntaxKind.NumericLiteralExpression,
                               SyntaxFactory.ParseToken($"{((GraphQLScalarValue)defaultValue).Value}f"))));

            case ASTNodeKind.StringValue:
                return(SyntaxFactory.EqualsValueClause(
                           SyntaxFactory.LiteralExpression(
                               SyntaxKind.StringLiteralExpression,
                               SyntaxFactory.ParseToken($"\"{((GraphQLScalarValue)defaultValue).Value}\""))));;

            case ASTNodeKind.BooleanValue:
                return(((GraphQLScalarValue)defaultValue).Value.ToLower() == "true"
                        ? SyntaxFactory.EqualsValueClause(SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression))
                        : SyntaxFactory.EqualsValueClause(SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression)));

            case ASTNodeKind.EnumValue:
                return(SyntaxFactory.EqualsValueClause(SyntaxFactory.MemberAccessExpression(
                                                           SyntaxKind.SimpleMemberAccessExpression,
                                                           type.Kind() == SyntaxKind.NullableType
                            ? ((NullableTypeSyntax)type).ElementType
                            : type,
                                                           SyntaxFactory.IdentifierName(((GraphQLScalarValue)defaultValue).Value))));
            }
            ;

            return(SyntaxFactory.EqualsValueClause(SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)));
        }
    public override object ParseLiteral(GraphQLValue value)
    {
        if (value is GraphQLStringValue stringValue)
        {
            if (stringValue.Value == "externalNull")
            {
                return(null);
            }

            if (stringValue.Value == "error")
            {
                throw new Exception("Cannot parse value");
            }

            return((string)stringValue.Value);
        }

        if (value is GraphQLNullValue)
        {
            return("internalNull");
        }

        throw new NotSupportedException();
    }
        public IValue Value(GraphQLValue source)
        {
            switch (source.Kind)
            {
            case ASTNodeKind.StringValue:
            {
                var str = (GraphQLScalarValue)source;
                return(new StringValue(str.Value).WithLocation(str, _body));
            }

            case ASTNodeKind.IntValue:
            {
                var str = (GraphQLScalarValue)source;

                if (int.TryParse(str.Value, out var intResult))
                {
                    return(new IntValue(intResult).WithLocation(str, _body));
                }

                // If the value doesn't fit in an integer, revert to using long...
                if (long.TryParse(str.Value, out var longResult))
                {
                    return(new LongValue(longResult).WithLocation(str, _body));
                }

                throw new ExecutionError($"Invalid number {str.Value}");
            }

            case ASTNodeKind.FloatValue:
            {
                var str = (GraphQLScalarValue)source;
                return(new FloatValue(ValueConverter.ConvertTo <double>(str.Value)).WithLocation(str, _body));
            }

            case ASTNodeKind.BooleanValue:
            {
                var str = (GraphQLScalarValue)source;
                return(new BooleanValue(ValueConverter.ConvertTo <bool>(str.Value)).WithLocation(str, _body));
            }

            case ASTNodeKind.EnumValue:
            {
                var str = (GraphQLScalarValue)source;
                return(new EnumValue(str.Value).WithLocation(str, _body));
            }

            case ASTNodeKind.Variable:
            {
                var vari = (GraphQLVariable)source;
                return(new VariableReference(Name(vari.Name)).WithLocation(vari, _body));
            }

            case ASTNodeKind.ObjectValue:
            {
                var obj    = (GraphQLObjectValue)source;
                var fields = obj.Fields.Select(ObjectField);
                return(new ObjectValue(fields).WithLocation(obj, _body));
            }

            case ASTNodeKind.ListValue:
            {
                var list   = (GraphQLListValue)source;
                var values = list.Values.Select(Value);
                return(new ListValue(values).WithLocation(list, _body));
            }

            case ASTNodeKind.NullValue:
            {
                var str = (GraphQLScalarValue)source;
                return(new NullValue().WithLocation(str, _body));
            }
            }

            throw new ExecutionError($"Unmapped value type {source.Kind}");
        }
示例#29
0
        public static object ToValue(this GraphQLValue source)
        {
            if (source == null)
            {
                return(null);
            }

            switch (source.Kind)
            {
            case ASTNodeKind.NullValue:
            {
                return(null);
            }

            case ASTNodeKind.StringValue:
            {
                var str = source as GraphQLScalarValue;
                Debug.Assert(str != null, nameof(str) + " != null");
                return(str.Value);
            }

            case ASTNodeKind.IntValue:
            {
                var str = source as GraphQLScalarValue;

                Debug.Assert(str != null, nameof(str) + " != null");
                if (int.TryParse(str.Value, out var intResult))
                {
                    return(intResult);
                }

                // If the value doesn't fit in an integer, revert to using long...
                if (long.TryParse(str.Value, out var longResult))
                {
                    return(longResult);
                }

                // If the value doesn't fit in an long, revert to using BigInteger...
                if (BigInteger.TryParse(str.Value, out var bigIntegerResult))
                {
                    return(bigIntegerResult);
                }

                throw new ExecutionError($"Invalid number {str.Value}");
            }

            case ASTNodeKind.FloatValue:
            {
                var str = source as GraphQLScalarValue;
                Debug.Assert(str != null, nameof(str) + " != null");
                return(ValueConverter.ConvertTo <double>(str.Value));
            }

            case ASTNodeKind.BooleanValue:
            {
                var str = source as GraphQLScalarValue;
                Debug.Assert(str != null, nameof(str) + " != null");
                return(ValueConverter.ConvertTo <bool>(str.Value));
            }

            case ASTNodeKind.EnumValue:
            {
                var str = source as GraphQLScalarValue;
                Debug.Assert(str != null, nameof(str) + " != null");
                return(str.Value);
            }

            case ASTNodeKind.ObjectValue:
            {
                var obj    = source as GraphQLObjectValue;
                var values = new Dictionary <string, object>();

                Debug.Assert(obj != null, nameof(obj) + " != null");
                obj.Fields.Apply(f => values[f.Name.Value] = ToValue(f.Value));
                return(values);
            }

            case ASTNodeKind.ListValue:
            {
                var list = source as GraphQLListValue;
                Debug.Assert(list != null, nameof(list) + " != null");

                if (list.Values == null)
                {
                    return(Array.Empty <object>());
                }

                object[] values = list.Values.Select(ToValue).ToArray();
                return(values);
            }

            default:
                throw new ExecutionError($"Unsupported value type {source.Kind}");
            }
        }
示例#30
0
 /// <inheritdoc/>
 public override object?ParseLiteral(GraphQLValue value) => value switch
 {