Since your DateTime accepts string values, you can inherit it from TSchemaStringType
and implement it like this:
TSchemaDateTimeType = class(TSchemaStringType)
strict protected
function ParseLiteral(Value: TASTValue): TValue; override;
function GetName: string; override;
function GetDisplayName: string; override;
public
function ParseValue(const Value: TValue): TValue; override;
function Serialize(const Value: TValue): TValue; override;
end;
...
{ TSchemaDateTimeype }
function TSchemaDateTimeType.GetDisplayName: string;
begin
Result := 'DateTime';
end;
function TSchemaDateTimeType.GetName: string;
begin
Result := 'DateTime';
end;
function TSchemaDateTimeType.ParseLiteral(Value: TASTValue): TValue;
var
DateValue: TDateTime;
begin
if Value is TASTStringValue then
begin
if not TryISO8601ToDate(TASTSTringValue(Value).Value, DateValue) then
raise EGraphQLCoercingParseLiteral.Create(Self.DisplayName, Value);
Result := TValue.From<TDateTime>(DateValue);
end
else
raise EGraphQLCoercingParseLiteral.Create(Self.DisplayName, Value);
end;
function TSchemaDateTimeType.ParseValue(const Value: TValue): TValue;
begin
if (Value.TypeInfo = System.TypeInfo(TDateTime)) or
(Value.TypeInfo = System.TypeInfo(TDate)) or
(Value.TypeInfo = System.TypeInfo(TTime)) then
Result := Value
else
raise EGraphQLCoercingParseValue.Create(Self.DisplayName, Value);
end;
function TSchemaDateTimeType.Serialize(const Value: TValue): TValue;
begin
if Value.IsEmpty then
Exit(TValue.Empty);
if not Value.TryCast(TypeInfo(TDateTime), Result) then
raise EGraphQLCoercingSerialize.Create(Self.DisplayName, Value);
Result := DateToISO8601(Value.AsType<TDateTime>, True);
end;
That should do it.