From a9df916e3830aed10b098ed25e1a35ae490d9866 Mon Sep 17 00:00:00 2001 From: Robert Andersson Date: Mon, 5 Feb 2024 16:27:28 +0100 Subject: [PATCH 1/3] Add TimeOnly converter --- .../Internal/ISO8601TimeOnlyConverter.cs | 17 ++++++++ .../Options/AttributeValueConverters.cs | 5 +++ .../Marshaller/Types/TimeOnlyTests.cs | 41 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs create mode 100644 tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs diff --git a/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs b/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs new file mode 100644 index 00000000..c21b670d --- /dev/null +++ b/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs @@ -0,0 +1,17 @@ +using System; +using Amazon.DynamoDBv2.Model; + +namespace DynamoDBGenerator.Converters.Internal; + +public class ISO8601TimeOnlyConverter: IValueTypeConverter +{ + public TimeOnly? Read(AttributeValue attributeValue) + { + return TimeOnly.TryParse(attributeValue.S, out var timeOnly) ? timeOnly : null; + } + + public AttributeValue Write(TimeOnly element) + { + return new AttributeValue {S = element.ToString("O")}; + } +} \ No newline at end of file diff --git a/src/DynamoDBGenerator/Options/AttributeValueConverters.cs b/src/DynamoDBGenerator/Options/AttributeValueConverters.cs index 027d33c2..22aa4169 100644 --- a/src/DynamoDBGenerator/Options/AttributeValueConverters.cs +++ b/src/DynamoDBGenerator/Options/AttributeValueConverters.cs @@ -100,6 +100,11 @@ public class AttributeValueConverters /// The converter. /// public IValueTypeConverter DateOnlyConverter { get; protected init; } = new ISO8601DateOnlyConverter(); + + /// + /// The converter. + /// + public IValueTypeConverter TimeOnlyConverter { get; protected init; } = new ISO8601TimeOnlyConverter(); /// /// The converter. diff --git a/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs b/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs new file mode 100644 index 00000000..1835dcaa --- /dev/null +++ b/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs @@ -0,0 +1,41 @@ +using Amazon.DynamoDBv2.Model; +using DynamoDBGenerator.Attributes; +using DynamoDBGenerator.SourceGenerator.Tests.DynamoDBDocumentTests.Marshaller.Asserters; + +namespace DynamoDBGenerator.SourceGenerator.Tests.DynamoDBDocumentTests.Marshaller.Types; + +[DynamoDBMarshaller(typeof(Container))] +public partial class TimeOnlyTests : RecordMarshalAsserter +{ + + protected override Container UnmarshallImplementation(Dictionary attributeValues) + { + return ContainerMarshaller.Unmarshall(attributeValues); + } + protected override Dictionary MarshallImplementation(Container element) + { + return ContainerMarshaller.Marshall(element); + } + + public TimeOnlyTests() : base(new[] {new TimeOnly(22, 12, 08), new TimeOnly(21, 12, 09)}, x => new AttributeValue {S = x.ToString("O")}) + { + } +} + +[DynamoDBMarshaller(typeof(Container))] +public partial class NullableTimeOnlyTests : RecordMarshalAsserter +{ + + protected override Container UnmarshallImplementation(Dictionary attributeValues) + { + return ContainerMarshaller.Unmarshall(attributeValues); + } + protected override Dictionary MarshallImplementation(Container element) + { + return ContainerMarshaller.Marshall(element); + } + + public NullableTimeOnlyTests() : base(new[] {new TimeOnly(22, 12, 08), new TimeOnly(21, 12, 09)}.Cast().Append(null), x => x is null ? null : new AttributeValue {S = x.Value.ToString("O")}) + { + } +} From e7aa19089b883cac72685368b5d0c51263dd4fa6 Mon Sep 17 00:00:00 2001 From: Robert Andersson Date: Mon, 5 Feb 2024 16:27:53 +0100 Subject: [PATCH 2/3] Add TimeOnly converter --- README.md | 1 + .../DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de181f17..b9c15f4a 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,7 @@ The source generator will look for attributes and implement interfaces that exis | Type | Field | Format | |------------------|-------|----------| | `DateOnly` | `S` | ISO 8601 | +| `TimeOnly` | `S` | ISO 8601 | | `DateTime` | `S` | ISO 8601 | | `DateTimeOffset` | `S` | ISO 8601 | | `TimeSpan` | `S` | ISO 8601 | diff --git a/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs b/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs index 1835dcaa..eceff4c9 100644 --- a/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs +++ b/tests/DynamoDBGenerator.SourceGenerator.Tests/DynamoDBDocumentTests/Marshaller/Types/TimeOnlyTests.cs @@ -7,7 +7,6 @@ namespace DynamoDBGenerator.SourceGenerator.Tests.DynamoDBDocumentTests.Marshall [DynamoDBMarshaller(typeof(Container))] public partial class TimeOnlyTests : RecordMarshalAsserter { - protected override Container UnmarshallImplementation(Dictionary attributeValues) { return ContainerMarshaller.Unmarshall(attributeValues); From 7c79a61095f8298a496929d0c1da8311863d27d8 Mon Sep 17 00:00:00 2001 From: Robert Andersson Date: Mon, 5 Feb 2024 23:53:54 +0100 Subject: [PATCH 3/3] Update ISO8601TimeOnlyConverter.cs --- .../Converters/Internal/ISO8601TimeOnlyConverter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs b/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs index c21b670d..51530571 100644 --- a/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs +++ b/src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs @@ -3,7 +3,7 @@ namespace DynamoDBGenerator.Converters.Internal; -public class ISO8601TimeOnlyConverter: IValueTypeConverter +internal class ISO8601TimeOnlyConverter: IValueTypeConverter { public TimeOnly? Read(AttributeValue attributeValue) { @@ -14,4 +14,4 @@ public AttributeValue Write(TimeOnly element) { return new AttributeValue {S = element.ToString("O")}; } -} \ No newline at end of file +}