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());
}