Skip to content

Commit ea858cf

Browse files
authored
Improved Noda Time scalar type descriptions (#7665)
1 parent 69fe81a commit ea858cf

23 files changed

+945
-64
lines changed

src/HotChocolate/Core/src/Types.NodaTime/BaseTypes/StringToStructBaseType.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Diagnostics.CodeAnalysis;
22
using HotChocolate.Language;
3+
using NodaTime.Text;
34
using static HotChocolate.Types.NodaTime.Properties.NodaTimeResources;
45

56
namespace HotChocolate.Types.NodaTime;
@@ -133,4 +134,32 @@ public override bool TryDeserialize(object? resultValue, out object? runtimeValu
133134
protected abstract bool TryDeserialize(
134135
string resultValue,
135136
[NotNullWhen(true)] out TRuntimeType? runtimeValue);
137+
138+
protected string CreateDescription(
139+
IPattern<TRuntimeType>[] allowedPatterns,
140+
string description,
141+
string extendedDescription)
142+
{
143+
if (allowedPatterns.All(PatternMap.ContainsKey))
144+
{
145+
var patternsText =
146+
string.Join("\n", allowedPatterns.Select(p => $"- `{PatternMap[p]}`"));
147+
var examplesText =
148+
string.Join("\n", allowedPatterns.Select(e => $"- `{ExampleMap[e]}`"));
149+
150+
return string.Format(extendedDescription, patternsText, examplesText);
151+
}
152+
153+
return description;
154+
}
155+
156+
/// <summary>
157+
/// A map from Noda Time patterns to more universal (ISO-like) formats for display purposes.
158+
/// </summary>
159+
protected abstract Dictionary<IPattern<TRuntimeType>, string> PatternMap { get; }
160+
161+
/// <summary>
162+
/// A map from Noda Time patterns to example strings.
163+
/// </summary>
164+
protected abstract Dictionary<IPattern<TRuntimeType>, string> ExampleMap { get; }
136165
}

src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ public DurationType(params IPattern<Duration>[] allowedPatterns) : base("Duratio
2525

2626
_allowedPatterns = allowedPatterns;
2727
_serializationPattern = allowedPatterns[0];
28-
Description = NodaTimeResources.DurationType_Description;
28+
29+
Description = CreateDescription(
30+
allowedPatterns,
31+
NodaTimeResources.DurationType_Description,
32+
NodaTimeResources.DurationType_Description_Extended);
2933
}
3034

3135
/// <summary>
@@ -46,4 +50,16 @@ protected override bool TryDeserialize(
4650
string resultValue,
4751
[NotNullWhen(true)] out Duration? runtimeValue)
4852
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
53+
54+
protected override Dictionary<IPattern<Duration>, string> PatternMap => new()
55+
{
56+
{ DurationPattern.Roundtrip, "-D:hh:mm:ss.sssssssss" },
57+
{ DurationPattern.JsonRoundtrip, "-hh:mm:ss.sssssssss" }
58+
};
59+
60+
protected override Dictionary<IPattern<Duration>, string> ExampleMap => new()
61+
{
62+
{ DurationPattern.Roundtrip, "-1:20:00:00.999999999" },
63+
{ DurationPattern.JsonRoundtrip, "-44:00:00.999999999" }
64+
};
4965
}

src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ public InstantType(params IPattern<Instant>[] allowedPatterns) : base("Instant")
2525

2626
_allowedPatterns = allowedPatterns;
2727
_serializationPattern = allowedPatterns[0];
28-
Description = NodaTimeResources.InstantType_Description;
28+
29+
Description = CreateDescription(
30+
allowedPatterns,
31+
NodaTimeResources.InstantType_Description,
32+
NodaTimeResources.InstantType_Description_Extended);
2933
}
3034

3135
/// <summary>
@@ -46,4 +50,16 @@ protected override bool TryDeserialize(
4650
string resultValue,
4751
[NotNullWhen(true)] out Instant? runtimeValue)
4852
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
53+
54+
protected override Dictionary<IPattern<Instant>, string> PatternMap => new()
55+
{
56+
{ InstantPattern.General, "YYYY-MM-DDThh:mm:ss±hh:mm" },
57+
{ InstantPattern.ExtendedIso, "YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm" }
58+
};
59+
60+
protected override Dictionary<IPattern<Instant>, string> ExampleMap => new()
61+
{
62+
{ InstantPattern.General, "2000-01-01T20:00:00Z" },
63+
{ InstantPattern.ExtendedIso, "2000-01-01T20:00:00.999999999Z" }
64+
};
4965
}

src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ public LocalDateTimeType(params IPattern<LocalDateTime>[] allowedPatterns) : bas
2525

2626
_allowedPatterns = allowedPatterns;
2727
_serializationPattern = allowedPatterns[0];
28-
Description = NodaTimeResources.LocalDateTimeType_Description;
28+
29+
Description = CreateDescription(
30+
_allowedPatterns,
31+
NodaTimeResources.LocalDateTimeType_Description,
32+
NodaTimeResources.LocalDateTimeType_Description_Extended);
2933
}
3034

3135
/// <summary>
@@ -46,4 +50,22 @@ protected override bool TryDeserialize(
4650
string resultValue,
4751
[NotNullWhen(true)] out LocalDateTime? runtimeValue)
4852
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
53+
54+
protected override Dictionary<IPattern<LocalDateTime>, string> PatternMap => new()
55+
{
56+
{ LocalDateTimePattern.GeneralIso, "YYYY-MM-DDThh:mm:ss" },
57+
{ LocalDateTimePattern.ExtendedIso, "YYYY-MM-DDThh:mm:ss.sssssssss" },
58+
{ LocalDateTimePattern.BclRoundtrip, "YYYY-MM-DDThh:mm:ss.sssssss" },
59+
{ LocalDateTimePattern.FullRoundtripWithoutCalendar, "YYYY-MM-DDThh:mm:ss.sssssssss" },
60+
{ LocalDateTimePattern.FullRoundtrip, "YYYY-MM-DDThh:mm:ss.sssssssss (calendar)" }
61+
};
62+
63+
protected override Dictionary<IPattern<LocalDateTime>, string> ExampleMap => new()
64+
{
65+
{ LocalDateTimePattern.GeneralIso, "2000-01-01T20:00:00" },
66+
{ LocalDateTimePattern.ExtendedIso, "2000-01-01T20:00:00.999" },
67+
{ LocalDateTimePattern.BclRoundtrip, "2000-01-01T20:00:00.9999999" },
68+
{ LocalDateTimePattern.FullRoundtripWithoutCalendar, "2000-01-01T20:00:00.999999999" },
69+
{ LocalDateTimePattern.FullRoundtrip, "2000-01-01T20:00:00.999999999 (ISO)" }
70+
};
4971
}

src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public LocalDateType(params IPattern<LocalDate>[] allowedPatterns) : base("Local
2626

2727
_allowedPatterns = allowedPatterns;
2828
_serializationPattern = allowedPatterns[0];
29-
Description = NodaTimeResources.LocalDateType_Description;
29+
30+
Description = CreateDescription(
31+
allowedPatterns,
32+
NodaTimeResources.LocalDateType_Description,
33+
NodaTimeResources.LocalDateType_Description_Extended);
3034
}
3135

3236
/// <summary>
@@ -47,4 +51,16 @@ protected override bool TryDeserialize(
4751
string resultValue,
4852
[NotNullWhen(true)] out LocalDate? runtimeValue)
4953
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
54+
55+
protected override Dictionary<IPattern<LocalDate>, string> PatternMap => new()
56+
{
57+
{ LocalDatePattern.Iso, "YYYY-MM-DD" },
58+
{ LocalDatePattern.FullRoundtrip, "YYYY-MM-DD (calendar)" }
59+
};
60+
61+
protected override Dictionary<IPattern<LocalDate>, string> ExampleMap => new()
62+
{
63+
{ LocalDatePattern.Iso, "2000-01-01" },
64+
{ LocalDatePattern.FullRoundtrip, "2000-01-01 (ISO)" }
65+
};
5066
}

src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public LocalTimeType(params IPattern<LocalTime>[] allowedPatterns) : base("Local
2626

2727
_allowedPatterns = allowedPatterns;
2828
_serializationPattern = allowedPatterns[0];
29-
Description = NodaTimeResources.LocalTimeType_Description;
29+
30+
Description = CreateDescription(
31+
allowedPatterns,
32+
NodaTimeResources.LocalTimeType_Description,
33+
NodaTimeResources.LocalTimeType_Description_Extended);
3034
}
3135

3236
/// <summary>
@@ -47,4 +51,18 @@ protected override bool TryDeserialize(
4751
string resultValue,
4852
[NotNullWhen(true)] out LocalTime? runtimeValue)
4953
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
54+
55+
protected override Dictionary<IPattern<LocalTime>, string> PatternMap => new()
56+
{
57+
{ LocalTimePattern.ExtendedIso, "hh:mm:ss.sssssssss" },
58+
{ LocalTimePattern.LongExtendedIso, "hh:mm:ss.sssssssss" },
59+
{ LocalTimePattern.GeneralIso, "hh:mm:ss" }
60+
};
61+
62+
protected override Dictionary<IPattern<LocalTime>, string> ExampleMap => new()
63+
{
64+
{ LocalTimePattern.ExtendedIso, "20:00:00.999" },
65+
{ LocalTimePattern.LongExtendedIso, "20:00:00.999999999" },
66+
{ LocalTimePattern.GeneralIso, "20:00:00" }
67+
};
5068
}

src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public OffsetDateTimeType(params IPattern<OffsetDateTime>[] allowedPatterns)
2626

2727
_allowedPatterns = allowedPatterns;
2828
_serializationPattern = _allowedPatterns[0];
29-
Description = NodaTimeResources.OffsetDateTimeType_Description;
29+
30+
Description = CreateDescription(
31+
allowedPatterns,
32+
NodaTimeResources.OffsetDateTimeType_Description,
33+
NodaTimeResources.OffsetDateTimeType_Description_Extended);
3034
}
3135

3236
/// <summary>
@@ -50,4 +54,20 @@ protected override bool TryDeserialize(
5054
string resultValue,
5155
[NotNullWhen(true)] out OffsetDateTime? runtimeValue)
5256
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
57+
58+
protected override Dictionary<IPattern<OffsetDateTime>, string> PatternMap => new()
59+
{
60+
{ OffsetDateTimePattern.GeneralIso, "YYYY-MM-DDThh:mm:ss±hh:mm" },
61+
{ OffsetDateTimePattern.ExtendedIso, "YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm" },
62+
{ OffsetDateTimePattern.Rfc3339, "YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm" },
63+
{ OffsetDateTimePattern.FullRoundtrip, "YYYY-MM-DDThh:mm:ss.sssssssss±hh:mm (calendar)" }
64+
};
65+
66+
protected override Dictionary<IPattern<OffsetDateTime>, string> ExampleMap => new()
67+
{
68+
{ OffsetDateTimePattern.GeneralIso, "2000-01-01T20:00:00Z" },
69+
{ OffsetDateTimePattern.ExtendedIso, "2000-01-01T20:00:00.999Z" },
70+
{ OffsetDateTimePattern.Rfc3339, "2000-01-01T20:00:00.999Z" },
71+
{ OffsetDateTimePattern.FullRoundtrip, "2000-01-01T20:00:00.999Z (ISO)" }
72+
};
5373
}

src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ public OffsetDateType(params IPattern<OffsetDate>[] allowedPatterns) : base("Off
2727

2828
_allowedPatterns = allowedPatterns;
2929
_serializationPattern = allowedPatterns[0];
30-
Description = NodaTimeResources.OffsetDateType_Description;
30+
31+
Description = CreateDescription(
32+
allowedPatterns,
33+
NodaTimeResources.OffsetDateType_Description,
34+
NodaTimeResources.OffsetDateType_Description_Extended);
3135
}
3236

3337
/// <summary>
@@ -48,4 +52,16 @@ protected override bool TryDeserialize(
4852
string resultValue,
4953
[NotNullWhen(true)] out OffsetDate? runtimeValue)
5054
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
55+
56+
protected override Dictionary<IPattern<OffsetDate>, string> PatternMap => new()
57+
{
58+
{ OffsetDatePattern.GeneralIso, "YYYY-MM-DD±hh:mm" },
59+
{ OffsetDatePattern.FullRoundtrip, "YYYY-MM-DD±hh:mm (calendar)" }
60+
};
61+
62+
protected override Dictionary<IPattern<OffsetDate>, string> ExampleMap => new()
63+
{
64+
{ OffsetDatePattern.GeneralIso, "2000-01-01Z" },
65+
{ OffsetDatePattern.FullRoundtrip, "2000-01-01Z (ISO)" }
66+
};
5167
}

src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public OffsetTimeType(params IPattern<OffsetTime>[] allowedPatterns) : base("Off
2626

2727
_allowedPatterns = allowedPatterns;
2828
_serializationPattern = _allowedPatterns[0];
29-
Description = NodaTimeResources.OffsetTimeType_Description;
29+
30+
Description = CreateDescription(
31+
allowedPatterns,
32+
NodaTimeResources.OffsetTimeType_Description,
33+
NodaTimeResources.OffsetTimeType_Description_Extended);
3034
}
3135

3236
/// <summary>
@@ -47,4 +51,18 @@ protected override bool TryDeserialize(
4751
string resultValue,
4852
[NotNullWhen(true)] out OffsetTime? runtimeValue)
4953
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
54+
55+
protected override Dictionary<IPattern<OffsetTime>, string> PatternMap => new()
56+
{
57+
{ OffsetTimePattern.GeneralIso, "hh:mm:ss±hh:mm" },
58+
{ OffsetTimePattern.ExtendedIso, "hh:mm:ss.sssssssss±hh:mm" },
59+
{ OffsetTimePattern.Rfc3339, "hh:mm:ss.sssssssss±hh:mm" }
60+
};
61+
62+
protected override Dictionary<IPattern<OffsetTime>, string> ExampleMap => new()
63+
{
64+
{ OffsetTimePattern.GeneralIso, "20:00:00Z" },
65+
{ OffsetTimePattern.ExtendedIso, "20:00:00.999Z" },
66+
{ OffsetTimePattern.Rfc3339, "20:00:00.999999999Z" }
67+
};
5068
}

src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ public OffsetType(params IPattern<Offset>[] allowedPatterns) : base("Offset")
2727

2828
_allowedPatterns = allowedPatterns;
2929
_serializationPattern = allowedPatterns[0];
30-
Description = NodaTimeResources.OffsetType_Description;
30+
31+
Description = CreateDescription(
32+
allowedPatterns,
33+
NodaTimeResources.OffsetType_Description,
34+
NodaTimeResources.OffsetType_Description_Extended);
3135
}
3236

3337
/// <summary>
@@ -48,4 +52,16 @@ protected override bool TryDeserialize(
4852
string resultValue,
4953
[NotNullWhen(true)] out Offset? runtimeValue)
5054
=> _allowedPatterns.TryParse(resultValue, out runtimeValue);
55+
56+
protected override Dictionary<IPattern<Offset>, string> PatternMap => new()
57+
{
58+
{ OffsetPattern.GeneralInvariant, "±hh:mm:ss" },
59+
{ OffsetPattern.GeneralInvariantWithZ, "Z" }
60+
};
61+
62+
protected override Dictionary<IPattern<Offset>, string> ExampleMap => new()
63+
{
64+
{ OffsetPattern.GeneralInvariant, "+02:30:00" },
65+
{ OffsetPattern.GeneralInvariantWithZ, "Z" }
66+
};
5167
}

0 commit comments

Comments
 (0)