sync current state
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user