This commit is contained in:
2026-04-17 07:08:04 +02:00
parent ca91af9682
commit 0d3bd47f7a
34 changed files with 17503 additions and 160 deletions
@@ -7,18 +7,8 @@ public class TransformationCatalog : ITransformationCatalog
public TransformationCatalog(IEnumerable<ITransformationStrategy> valueStrategies, IEnumerable<IRecordTransformationStrategy> recordStrategies)
{
_items = valueStrategies
.Select(x => new TransformationCatalogItem
{
Key = x.TransformationType,
RuleScope = "Value",
Description = x.Description
})
.Concat(recordStrategies.Select(x => new TransformationCatalogItem
{
Key = x.TransformationType,
RuleScope = "Record",
Description = x.Description
}))
.Select(x => BuildItem(x.TransformationType, "Value", x.Description, x.GetType()))
.Concat(recordStrategies.Select(x => BuildItem(x.TransformationType, "Record", x.Description, x.GetType())))
.OrderBy(x => x.RuleScope, StringComparer.OrdinalIgnoreCase)
.ThenBy(x => x.Key, StringComparer.OrdinalIgnoreCase)
.ToList();
@@ -30,4 +20,90 @@ public class TransformationCatalog : ITransformationCatalog
=> _items
.Where(x => string.Equals(x.RuleScope, ruleScope, StringComparison.OrdinalIgnoreCase))
.ToList();
private static TransformationCatalogItem BuildItem(string key, string ruleScope, string description, Type implementationType)
=> new()
{
Key = key,
RuleScope = ruleScope,
Description = description,
TypeName = implementationType.Name,
SourceFile = implementationType == typeof(FirstNonEmptyRecordTransformationStrategy)
? "Services/TransformationStrategies.cs"
: "Services/TransformationStrategies.cs",
CodeSnippet = GetCodeSnippet(key, ruleScope)
};
private static string GetCodeSnippet(string key, string ruleScope)
=> (ruleScope, key) switch
{
("Value", "Copy") => """
public object? Transform(object? sourceValue, string? argument)
=> sourceValue;
""",
("Value", "Uppercase") => """
public object? Transform(object? sourceValue, string? argument)
=> sourceValue?.ToString()?.ToUpperInvariant();
""",
("Value", "Lowercase") => """
public object? Transform(object? sourceValue, string? argument)
=> sourceValue?.ToString()?.ToLowerInvariant();
""",
("Value", "Prefix") => """
public object? Transform(object? sourceValue, string? argument)
=> $"{argument}{sourceValue}";
""",
("Value", "Suffix") => """
public object? Transform(object? sourceValue, string? argument)
=> $"{sourceValue}{argument}";
""",
("Value", "Replace") => """
public object? Transform(object? sourceValue, string? argument)
{
var input = sourceValue?.ToString();
var parts = argument?.Split("=>", 2, StringSplitOptions.TrimEntries);
return parts?.Length == 2
? input?.Replace(parts[0], parts[1], StringComparison.OrdinalIgnoreCase)
: input;
}
""",
("Value", "Constant") => """
public object? Transform(object? sourceValue, string? argument)
=> argument;
""",
("Value", "NormalizeCurrencyCode") => """
public object? Transform(object? sourceValue, string? argument)
{
var input = sourceValue?.ToString()?.Trim();
return aliases.TryGetValue(input ?? "", out var mapped)
? mapped
: input?.ToUpperInvariant();
}
""",
("Record", "FirstNonEmpty") => """
public void Transform(SalesRecord record, FieldTransformationRule rule)
{
var sourceFields = rule.Argument.Split(['|', ',', ';'], StringSplitOptions.TrimEntries);
foreach (var sourceField in sourceFields)
{
var value = sourceProperty.GetValue(record);
if (IsMeaningfulValue(value))
{
SetPropertyValue(record, targetProperty, value);
return;
}
}
}
""",
("Record", "ConvertCurrency") => """
public void Transform(SalesRecord record, FieldTransformationRule rule)
{
var options = ParseOptions(rule.Argument);
var rate = exchangeRateService.ResolveRate(sourceCurrency, targetCurrency, effectiveDate);
if (rate.HasValue)
SetPropertyValue(record, targetAmountProperty, sourceAmount * rate.Value);
}
""",
_ => "// Kein Snippet hinterlegt."
};
}