-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDynamoDBMarshallerExtensions.cs
75 lines (66 loc) · 2.98 KB
/
DynamoDBMarshallerExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using DynamoDBGenerator.Internal;
namespace DynamoDBGenerator.Extensions;
/// <summary>
/// Contains extension methods for <see cref="IDynamoDBMarshaller{TEntity,TArg,TEntityAttributeNameTracker,TArgumentAttributeValueTracker}"/>
/// </summary>
public static class DynamoDBMarshallerExtensions
{
/// <summary>
/// Creates an <see cref="IAttributeExpression"/> based on the expressions being built inside <paramref name="expressionBuilders"/>
/// The expression can be accessed in the same order as you passed arguments to <paramref name="expressionBuilders"/>.
/// </summary>
public static IAttributeExpression ToAttributeExpression<TArg, TReferences, TArgumentReferences>(
Func<TReferences> entityReferences,
Func<TArgumentReferences> argumentReferences,
TArg arg,
params Func<TReferences, TArgumentReferences, string>[] expressionBuilders
)
where TReferences : IAttributeExpressionNameTracker
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
{
var nameTracker = entityReferences();
var valueTracker = argumentReferences();
var expressions = Expressions(nameTracker, valueTracker, expressionBuilders);
return new AttributeExpression(
Expressions: expressions,
Values: CreateDictionary(valueTracker.AccessedValues(arg)),
Names: CreateDictionary(nameTracker.AccessedNames())
);
static Dictionary<string, TValue> CreateDictionary<TValue>(
IEnumerable<KeyValuePair<string, TValue>> keyValuePairs)
{
var dict = new Dictionary<string, TValue>();
foreach (var keyValuePair in keyValuePairs)
dict[keyValuePair.Key] = keyValuePair.Value;
return dict;
}
static string[] Expressions(
TReferences references,
TArgumentReferences argumentReferences,
Func<TReferences, TArgumentReferences, string>[] expressionBuilders)
{
var arr = new string[expressionBuilders.Length];
for (var i = 0; i < expressionBuilders.Length; i++)
arr[i] = expressionBuilders[i](references, argumentReferences);
return arr;
}
}
/// <inheritdoc cref="ToAttributeExpression{TArg,TReferences,TArgumentReferences}"/>
public static IAttributeExpression ToAttributeExpression<T, TArg, TReferences, TArgumentReferences>(
this IDynamoDBMarshaller<T, TArg, TReferences, TArgumentReferences> item,
TArg arg,
params Func<TReferences, TArgumentReferences, string>[] expressionBuilders
)
where TReferences : IAttributeExpressionNameTracker
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
{
return ToAttributeExpression(
item.AttributeExpressionNameTracker,
item.AttributeExpressionValueTracker,
arg,
expressionBuilders
);
}
}