Custom Scalars

TGQL supports adding custom scalars with their custom value conversion logic.

Following example adds custom scalar and converter []


        [Fact]
        public async Task Part6_Custom_Scalar()
        {
            // Create builder and load sdl
            var builder = new SchemaBuilder()
                .Sdl(@"

                # Custom scalar defined in the SDL
                scalar Uri

                type Query {
                    url: Uri!
                }
                ");

            // Get query type
            builder.GetQuery(out var query);

            // Build schema by binding resolvers from ObjectTypeMap
            var schema = SchemaTools.MakeExecutableSchema(
                builder,
                new ObjectTypeMap
                {
                    {
                        query.Name, new FieldResolversMap
                        {
                            {
                                "url", context => ResolveSync.As(new Uri("https://localhost/"))
                            }
                        }
                    }
                },
                converters: new Dictionary<string, IValueConverter>()
                {
                    // this will add value converter for Uri scalar type
                    ["Uri"] = new InlineConverter(
                        serialize: value =>
                        {
                            var uri = (Uri) value;
                            return uri.ToString();
                        },
                        parseValue: value => new Uri(value.ToString()),
                        parseLiteral: value =>
                        {
                            if (value.Kind == NodeKind.StringValue)
                            {
                                return new Uri((StringValue)value);
                            }

                            throw new ArgumentOutOfRangeException(
                                nameof(value),
                                $"Cannot coerce Uri from value kind: '{value.Kind}'");
                        },
                        serializeLiteral: value => new StringValue(Encoding.UTF8.GetBytes(value.ToString())))
                });


            // execute query
            var result = await Executor.ExecuteAsync(new ExecutionOptions()
            {
                Schema = schema,
                Document = Parser.ParseDocument(@"{ url }")
            });

            var url = result.Data["url"];
            Assert.Equal("https://localhost/", url.ToString());
        }