sync current state

This commit is contained in:
2026-03-01 11:43:38 +01:00
parent 147ced281f
commit 4c8bcba514
12 changed files with 538 additions and 131 deletions
+27 -4
View File
@@ -37,6 +37,7 @@ struct ImportMapping: Equatable {
enum FieldFormatterType: String, CaseIterable, Identifiable {
case passthrough
case integerLookupToNumber
case dateISO8601ToISO8601
case dateGermanDayMonthYearToISO8601
case dateGermanDayMonthYearHourMinuteToISO8601
@@ -47,6 +48,7 @@ enum FieldFormatterType: String, CaseIterable, Identifiable {
struct FieldFormatterConfig: Equatable {
var formatterType: FieldFormatterType
var integerLookup: [String: String] = [:]
static func `default`(for fieldType: TemplateField.FieldType) -> FieldFormatterConfig {
if fieldType == .date {
@@ -160,26 +162,47 @@ enum ImportValue: Hashable {
enum ImportFieldFormatterEngine {
static func apply(sourceText: String, config: FieldFormatterConfig) -> String? {
let trimmed = sourceText.trimmingCharacters(in: .whitespacesAndNewlines)
switch config.formatterType {
case .passthrough:
return sourceText
case .integerLookupToNumber:
return applyIntegerLookup(sourceText: trimmed, config: config)
case .dateISO8601ToISO8601:
guard let date = parseISO8601(sourceText.trimmingCharacters(in: .whitespacesAndNewlines)) else {
guard let date = parseISO8601(trimmed) else {
return nil
}
return iso8601String(from: date)
case .dateGermanDayMonthYearToISO8601:
return convertDate(sourceText, sourcePattern: "dd.MM.yyyy")
return convertDate(trimmed, sourcePattern: "dd.MM.yyyy")
case .dateGermanDayMonthYearHourMinuteToISO8601:
return convertDate(sourceText, sourcePattern: "dd.MM.yyyy HH:mm")
return convertDate(trimmed, sourcePattern: "dd.MM.yyyy HH:mm")
case .dateUnixSecondsToISO8601:
guard let seconds = Double(sourceText.trimmingCharacters(in: .whitespacesAndNewlines)) else {
guard let seconds = Double(trimmed) else {
return nil
}
return iso8601String(from: Date(timeIntervalSince1970: seconds))
}
}
private static func applyIntegerLookup(sourceText: String, config: FieldFormatterConfig) -> String? {
if let mapped = config.integerLookup[sourceText]?.trimmingCharacters(in: .whitespacesAndNewlines), !mapped.isEmpty {
return mapped
}
if
let number = Double(sourceText),
number.rounded() == number
{
let integerKey = String(Int(number))
if let mapped = config.integerLookup[integerKey]?.trimmingCharacters(in: .whitespacesAndNewlines), !mapped.isEmpty {
return mapped
}
}
return nil
}
private static func convertDate(_ input: String, sourcePattern: String) -> String? {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")