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/"
}
}
""");
}