Skip to content

Commit e49eddb

Browse files
committed
Support multiple frameworks
1 parent d89deeb commit e49eddb

5 files changed

Lines changed: 160 additions & 24 deletions

File tree

src/DynamoDBGenerator/Converters/Internal/ISO8601DateOnlyConverter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#if NET6_0_OR_GREATER
12
using System;
23
using Amazon.DynamoDBv2.Model;
34

@@ -14,4 +15,5 @@ public AttributeValue Write(DateOnly element)
1415
{
1516
return new AttributeValue { S = element.ToString("O") };
1617
}
17-
}
18+
}
19+
#endif

src/DynamoDBGenerator/Converters/Internal/ISO8601TimeOnlyConverter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#if NET6_0_OR_GREATER
12
using System;
23
using Amazon.DynamoDBv2.Model;
34

@@ -15,3 +16,4 @@ public AttributeValue Write(TimeOnly element)
1516
return new AttributeValue {S = element.ToString("O")};
1617
}
1718
}
19+
#endif

src/DynamoDBGenerator/DynamoDBGenerator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
55
<Nullable>enable</Nullable>
66
<IsPackable>true</IsPackable>
77
<LangVersion>10.0</LangVersion>

src/DynamoDBGenerator/Internal/MarshallHelper.cs

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Amazon.DynamoDBv2.Model;
5+
#if NET6_0_OR_GREATER
56
using static System.Runtime.InteropServices.CollectionsMarshal;
7+
#endif
68

79
namespace DynamoDBGenerator.Internal;
810

@@ -17,8 +19,8 @@ public static class MarshallHelper
1719
#pragma warning disable CS1591
1820
public static AttributeValue Null { get; } = new() { NULL = true };
1921

20-
public static AttributeValue? ToAttributeValue(Dictionary<string, AttributeValue>? dict) => dict is null
21-
? null
22+
public static AttributeValue? ToAttributeValue(Dictionary<string, AttributeValue>? dict) => dict is null
23+
? null
2224
: new AttributeValue { M = dict };
2325

2426
public static AttributeValue FromDictionary<T, TArgument>(
@@ -34,8 +36,8 @@ public static AttributeValue FromDictionary<T, TArgument>(
3436
_ => new Dictionary<string, AttributeValue>()
3537
};
3638

37-
foreach (var (key, value) in dictionary)
38-
elements[key] = resultSelector(value, argument, $"{dataMember}[{key}]");
39+
foreach (var x in dictionary)
40+
elements[x.Key] = resultSelector(x.Value, argument, $"{dataMember}[{x.Key}]");
3941

4042
return new AttributeValue { M = elements };
4143
}
@@ -89,8 +91,8 @@ public static Dictionary<string, T> ToDictionary<T, TArgument>(
8991
{
9092
var elements = new Dictionary<string, T>(dictionary.Count);
9193

92-
foreach (var (key, value) in dictionary)
93-
elements[key] = resultSelector(value, argument, $"{dataMember}[{key}]");
94+
foreach (var x in dictionary)
95+
elements[x.Key] = resultSelector(x.Value, argument, $"{dataMember}[{x.Key}]");
9496

9597
return elements;
9698
}
@@ -101,10 +103,17 @@ public static AttributeValue FromArray<T, TArgument>(
101103
string? dataMember,
102104
Func<T, TArgument, string?, AttributeValue> resultSelector)
103105
{
104-
var span = array.AsSpan();
105-
var attributeValues = new List<AttributeValue>(span.Length);
106-
for (var i = 0; i < span.Length; i++)
107-
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
106+
#if NET6_0_OR_GREATER
107+
var collection = array.AsSpan();
108+
var collectionLength = collection.Length;
109+
#else
110+
var collectionLength = array.Length;
111+
var collection = array;
112+
#endif
113+
114+
var attributeValues = new List<AttributeValue>();
115+
for (var i = 0; i < collectionLength; i++)
116+
attributeValues.Add(resultSelector(collection[i], argument, $"{dataMember}[{i}]"));
108117

109118
return new AttributeValue { L = attributeValues };
110119
}
@@ -115,10 +124,17 @@ public static AttributeValue FromList<T, TArgument>(
115124
string? dataMember,
116125
Func<T, TArgument, string?, AttributeValue> resultSelector)
117126
{
118-
var span = AsSpan(list);
119-
var attributeValues = new List<AttributeValue>(span.Length);
120-
for (var i = 0; i < span.Length; i++)
121-
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
127+
#if NET6_0_OR_GREATER
128+
var collection = AsSpan(list);
129+
var collectionLength = collection.Length;
130+
#else
131+
var collectionLength = list.Count;
132+
var collection = list;
133+
#endif
134+
135+
var attributeValues = new List<AttributeValue>(collectionLength);
136+
for (var i = 0; i < collectionLength; i++)
137+
attributeValues.Add(resultSelector(collection[i], argument, $"{dataMember}[{i}]"));
122138

123139
return new AttributeValue { L = attributeValues };
124140
}
@@ -129,9 +145,13 @@ public static AttributeValue FromEnumerable<T, TArgument>(
129145
string? dataMember,
130146
Func<T, TArgument, string?, AttributeValue> resultSelector)
131147
{
148+
#if NET6_0_OR_GREATER
132149
var attributeValues = enumerable.TryGetNonEnumeratedCount(out var count)
133150
? new List<AttributeValue>(count)
134151
: new List<AttributeValue>();
152+
#else
153+
var attributeValues = new List<AttributeValue>();
154+
#endif
135155

136156
foreach (var (element, i) in enumerable.Select((x, y) => (x, y)))
137157
attributeValues.Add(resultSelector(element, argument, $"{dataMember}[{i}]"));
@@ -146,10 +166,16 @@ public static List<TResult> ToList<TResult, TArgument>(
146166
Func<AttributeValue, TArgument, string?, TResult> resultSelector
147167
)
148168
{
149-
var span = AsSpan(attributeValues);
150-
var elements = new List<TResult>(span.Length);
151-
for (var i = 0; i < span.Length; i++)
152-
elements.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
169+
#if NET6_0_OR_GREATER
170+
var collection = AsSpan(attributeValues);
171+
var collectionLength = collection.Length;
172+
#else
173+
var collection = attributeValues;
174+
var collectionLength = collection.Count;
175+
#endif
176+
var elements = new List<TResult>(collectionLength);
177+
for (var i = 0; i < collectionLength; i++)
178+
elements.Add(resultSelector(collection[i], argument, $"{dataMember}[{i}]"));
153179

154180
return elements;
155181
}
@@ -172,10 +198,16 @@ public static TResult[] ToArray<TResult, TArgument>(
172198
Func<AttributeValue, TArgument, string?, TResult> resultSelector
173199
)
174200
{
175-
var span = AsSpan(attributeValues);
176-
var elements = new TResult[span.Length];
177-
for (var i = 0; i < span.Length; i++)
178-
elements[i] = resultSelector(span[i], argument, $"{dataMember}[{i}]");
201+
#if NET6_0_OR_GREATER
202+
var collection = AsSpan(attributeValues);
203+
var collectionLength = collection.Length;
204+
#else
205+
var collection = attributeValues;
206+
var collectionLength = collection.Count;
207+
#endif
208+
var elements = new TResult[collectionLength];
209+
for (var i = 0; i < collectionLength; i++)
210+
elements[i] = resultSelector(collection[i], argument, $"{dataMember}[{i}]");
179211

180212
return elements;
181213
}

src/DynamoDBGenerator/Options/AttributeValueConverters.cs

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace DynamoDBGenerator.Options;
1111
/// </summary>
1212
public class AttributeValueConverters
1313
{
14+
#if NET6_0_OR_GREATER
15+
1416
/// <summary>
1517
/// The <see cref="string"/> converter.
1618
/// </summary>
@@ -115,5 +117,103 @@ public class AttributeValueConverters
115117
/// The <see cref="Guid"/> converter.
116118
/// </summary>
117119
public IValueTypeConverter<Guid> GuidConverter { get; protected init;} = new GuidConverter();
120+
#else
121+
122+
/// <summary>
123+
/// The <see cref="string"/> converter.
124+
/// </summary>
125+
public IReferenceTypeConverter<string> StringConverter { get; protected set; } = new StringConverter();
126+
127+
/// <summary>
128+
/// The <see cref="DateTime"/> converter.
129+
/// </summary>
130+
public IValueTypeConverter<DateTime> DateTimeConverter { get; protected set;} = new ISO8601DateTimeConverter();
131+
132+
/// <summary>
133+
/// The <see cref="DateTimeOffsetConverter"/> converter.
134+
/// </summary>
135+
public IValueTypeConverter<DateTimeOffset> DateTimeOffsetConverter { get; protected set;} = new ISO8601DateTimeOffsetConverter();
136+
137+
/// <summary>
138+
/// The <see cref="bool"/> converter.
139+
/// </summary>
140+
public IValueTypeConverter<bool> BoolConverter { get; protected set;} = new BoolConverter();
141+
142+
/// <summary>
143+
/// The <see cref="char"/> converter.
144+
/// </summary>
145+
public IValueTypeConverter<char> CharConverter { get; protected set;} = new CharConverter();
146+
147+
/// <summary>
148+
/// The <see cref="MemoryStream"/> converter.
149+
/// </summary>
150+
public IReferenceTypeConverter<MemoryStream> MemoryStreamConverter { get; protected set;} = new MemoryStreamConverter();
151+
152+
/// <summary>
153+
/// The <see cref="int"/> converter.
154+
/// </summary>
155+
public IValueTypeConverter<int> Int32Converter { get; protected set; } = new Int32Converter();
156+
157+
/// <summary>
158+
/// The <see cref="decimal"/> converter.
159+
/// </summary>
160+
public IValueTypeConverter<decimal> DecimalConverter { get; protected set;} = new DecimalConverter();
161+
162+
/// <summary>
163+
/// The <see cref="double"/> converter.
164+
/// </summary>
165+
public IValueTypeConverter<double> DoubleConverter { get; protected set;} = new DoubleConverter();
166+
167+
/// <summary>
168+
/// The <see cref="float"/> converter.
169+
/// </summary>
170+
public IValueTypeConverter<float> FloatConverter { get; protected set;} = new FloatConverter();
171+
172+
/// <summary>
173+
/// The <see cref="long"/> converter.
174+
/// </summary>
175+
public IValueTypeConverter<long> LongConverter { get; protected set;} = new LongConverter();
176+
177+
/// <summary>
178+
/// The <see cref="ulong"/> converter.
179+
/// </summary>
180+
public IValueTypeConverter<ulong> ULongConverter { get; protected set;} = new ULongConverter();
181+
182+
/// <summary>
183+
/// The <see cref="uint"/> converter.
184+
/// </summary>
185+
public IValueTypeConverter<uint> UIntConverter { get; protected set;} = new UIntConverter();
186+
187+
/// <summary>
188+
/// The <see cref="sbyte"/> converter.
189+
/// </summary>
190+
public IValueTypeConverter<sbyte> SbyteConverter { get; protected set;} = new SByteConverter();
191+
192+
/// <summary>
193+
/// The <see cref="short"/> converter.
194+
/// </summary>
195+
public IValueTypeConverter<short> ShortConverter { get; protected set;} = new ShortConverter();
196+
197+
/// <summary>
198+
/// The <see cref="byte"/> converter.
199+
/// </summary>
200+
public IValueTypeConverter<byte> ByteConverter { get; protected set;} = new ByteConverter();
201+
202+
/// <summary>
203+
/// The <see cref="ushort"/> converter.
204+
/// </summary>
205+
public IValueTypeConverter<ushort> UShortConverter { get; protected set;} = new UShortConverter();
206+
207+
/// <summary>
208+
/// The <see cref="TimeSpan"/> converter.
209+
/// </summary>
210+
public IValueTypeConverter<TimeSpan> TimeSpanConverter { get; protected set;} = new ISO8601TimeSpanConveter();
211+
212+
/// <summary>
213+
/// The <see cref="Guid"/> converter.
214+
/// </summary>
215+
public IValueTypeConverter<Guid> GuidConverter { get; protected set;} = new GuidConverter();
216+
217+
#endif
118218

119219
}

0 commit comments

Comments
 (0)