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()
            .Add(@"

                # Custom scalar defined in the SDL
                scalar Uri

                type Query {
                    url: Uri!
                }
                ");

        // Build schema by binding resolvers from ObjectTypeMap
        var schema = await builder.Build(new SchemaBuildOptions
        {
            Resolvers = new ResolversMap
            {
                {
                    "Query", new FieldResolversMap
                    {
                        {
                            "url", () => new Uri("https://localhost/")
                        }
                    }
                }
            },
            ValueConverters = new Dictionary<string, IValueConverter>
            {
                // this will add value converter for Uri scalar type
                ["Uri"] = new InlineConverter(
                    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.Execute(schema, @"{ url }");

        result.ShouldMatchJson("""
            {
              "data": {
                "url": "https://localhost/"
              }
            }
            """);
    }