Skip to content

Commit a03025e

Browse files
committed
Add separation with nullability
1 parent f09e152 commit a03025e

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

src/DynamoDBGenerator/Converters/Internal/StringSetConverter.cs renamed to src/DynamoDBGenerator/Converters/Internal/NoneNullableStringSetConverter.cs

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,79 @@
1+
using System;
12
using System.Collections.Generic;
3+
using System.Linq;
24
using System.Runtime.CompilerServices;
5+
using System.Runtime.InteropServices;
36
using Amazon.DynamoDBv2.Model;
47
using DynamoDBGenerator.Internal;
58

69
namespace DynamoDBGenerator.Converters.Internal;
710

8-
internal sealed class StringSetConverter :
11+
internal sealed class NoneNullableStringSetConverter :
912
IReferenceTypeConverter<IReadOnlySet<string>>,
1013
IReferenceTypeConverter<HashSet<string>>,
1114
IReferenceTypeConverter<ISet<string>>,
1215
IReferenceTypeConverter<SortedSet<string>>,
13-
IStaticSingleton<StringSetConverter>
16+
IStaticSingleton<NoneNullableStringSetConverter>
1417
{
1518
[MethodImpl(MethodImplOptions.AggressiveInlining)]
16-
private static HashSet<string>? ToHashSet(AttributeValue attributeValue)
19+
private static TSet? ToSet<TSet>(
20+
AttributeValue attributeValue,
21+
Func<int, TSet> factory
22+
)
23+
where TSet : class, ISet<string>
1724
{
18-
return attributeValue.IsSSSet
19-
? new HashSet<string>(attributeValue.SS)
20-
: null;
25+
if (attributeValue.IsSSSet is false)
26+
return null;
27+
28+
var span = CollectionsMarshal.AsSpan(attributeValue.SS);
29+
var set = factory(span.Length);
30+
foreach (var item in span)
31+
{
32+
if (item is null)
33+
throw ExceptionHelper.NotNull(null);
34+
35+
set.Add(item);
36+
}
37+
38+
return set;
2139
}
2240

2341
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2442
private static AttributeValue ToAttributeValue(IEnumerable<string> enumerable)
2543
{
26-
return new AttributeValue { SS = new List<string>(enumerable) };
44+
var ss = enumerable.TryGetNonEnumeratedCount(out var count)
45+
? new List<string>(capacity: count)
46+
: new List<string>();
47+
48+
foreach (var item in enumerable)
49+
{
50+
if (item is null) // TODO need datamember
51+
throw ExceptionHelper.NotNull(null);
52+
53+
ss.Add(item);
54+
}
55+
56+
return new AttributeValue { SS = ss };
2757
}
2858

2959
IReadOnlySet<string>? IReferenceTypeConverter<IReadOnlySet<string>>.Read(AttributeValue attributeValue)
3060
{
31-
return ToHashSet(attributeValue);
61+
return ToSet(attributeValue, x => new HashSet<string>(x));
3262
}
3363

3464
ISet<string>? IReferenceTypeConverter<ISet<string>>.Read(AttributeValue attributeValue)
3565
{
36-
return ToHashSet(attributeValue);
66+
return ToSet(attributeValue, x => new HashSet<string>(x));
3767
}
3868

3969
HashSet<string>? IReferenceTypeConverter<HashSet<string>>.Read(AttributeValue attributeValue)
4070
{
41-
return ToHashSet(attributeValue);
71+
return ToSet(attributeValue, x => new HashSet<string>(x));
4272
}
4373

4474
SortedSet<string>? IReferenceTypeConverter<SortedSet<string>>.Read(AttributeValue attributeValue)
4575
{
46-
return attributeValue.IsSSSet
47-
? new SortedSet<string>(attributeValue.SS)
48-
: null;
76+
return ToSet(attributeValue, _ => new SortedSet<string>());
4977
}
5078

5179
AttributeValue IReferenceTypeConverter<SortedSet<string>>.Write(SortedSet<string> element)

src/DynamoDBGenerator/Options/AttributeValueConverters.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,20 @@ public class AttributeValueConverters
121121
/// <summary>
122122
/// The <see cref="ISet{T}"/> converter for <see cref="string"/> sets.
123123
/// </summary>
124-
public IReferenceTypeConverter<ISet<string>> ISetConverter { get; protected init; } = Singleton.Static<StringSetConverter>();
124+
public IReferenceTypeConverter<ISet<string>> NoneNullableStringISetConverter { get; protected init; } = Singleton.Static<NoneNullableStringSetConverter>();
125125

126126
/// <summary>
127127
/// The <see cref="IReadOnlySet{T}"/> converter for <see cref="string"/> sets.
128128
/// </summary>
129-
public IReferenceTypeConverter<IReadOnlySet<string>> IReadOnlySetConverter { get; protected init; } = Singleton.Static<StringSetConverter>();
129+
public IReferenceTypeConverter<IReadOnlySet<string>> NoneNullableStringIReadOnlySetConverter { get; protected init; } = Singleton.Static<NoneNullableStringSetConverter>();
130130

131131
/// <summary>
132132
/// The <see cref="HashSet{T}"/> converter for <see cref="string"/> sets.
133133
/// </summary>
134-
public IReferenceTypeConverter<HashSet<string>> HashSetConverter { get; protected init; } = Singleton.Static<StringSetConverter>();
134+
public IReferenceTypeConverter<HashSet<string>> NoneNullableStringhashSetConverter { get; protected init; } = Singleton.Static<NoneNullableStringSetConverter>();
135135

136136
/// <summary>
137137
/// The <see cref="SortedSet{T}"/> converter for <see cref="string"/> sets.
138138
/// </summary>
139-
public IReferenceTypeConverter<SortedSet<string>> SortedSetConverter { get; protected init; } = Singleton.Static<StringSetConverter>();
139+
public IReferenceTypeConverter<SortedSet<string>> NoneNullableStringSortedSetConverter { get; protected init; } = Singleton.Static<NoneNullableStringSetConverter>();
140140
}

0 commit comments

Comments
 (0)