Files
bulkhealth/BulkHealthApp/Import/ImportModels.swift

112 lines
2.4 KiB
Swift

import Foundation
import HealthKit
struct TemplateField: Identifiable, Hashable {
enum FieldType: String {
case string
case number
case date
case stringArray
}
let id: String
let title: String
let description: String
let type: FieldType
let isRequired: Bool
}
struct HealthTemplate {
let id: String
let title: String
let localizedHealthTypeName: String
let fields: [TemplateField]
}
struct ImportMapping: Equatable {
var sourceKeyByFieldID: [String: String]
func sourceKey(for fieldID: String) -> String {
sourceKeyByFieldID[fieldID, default: ""]
}
}
struct MoodwellPayload: Decodable {
let mymoods: [MoodwellEntry]
}
struct MoodwellEntry: Decodable, Identifiable {
let arrayOfPhotos: [String]
let moodType: Int
let moodUniqueIdentifier: String
let arrayOfBadEmotions: [String]
let notesString: String?
let arrayOfWeathers: [String]
let createdAt: String
let arrayOfActivities: [String]
let arrayOfGoodEmotions: [String]
var id: String { moodUniqueIdentifier }
var sourceDictionary: [String: ImportValue] {
[
"moodType": .number(Double(moodType)),
"moodUniqueIdentifier": .string(moodUniqueIdentifier),
"arrayOfBadEmotions": .stringArray(arrayOfBadEmotions),
"notesString": notesString.map(ImportValue.string) ?? .null,
"arrayOfWeathers": .stringArray(arrayOfWeathers),
"createdAt": .string(createdAt),
"arrayOfActivities": .stringArray(arrayOfActivities),
"arrayOfGoodEmotions": .stringArray(arrayOfGoodEmotions)
]
}
}
enum ImportValue: Hashable {
case string(String)
case number(Double)
case stringArray([String])
case null
func asString() -> String? {
if case let .string(value) = self {
return value
}
return nil
}
func asNumber() -> Double? {
if case let .number(value) = self {
return value
}
return nil
}
func asStringArray() -> [String]? {
if case let .stringArray(value) = self {
return value
}
return nil
}
}
struct StateOfMindDraft: Identifiable, Hashable {
let id: String
let date: Date
let kind: HKStateOfMind.Kind
let valence: Double
let labels: [HKStateOfMind.Label]
let associations: [HKStateOfMind.Association]
let metadata: [String: String]
var summaryText: String {
"\(date.formatted(date: .abbreviated, time: .shortened))\(kind == .dailyMood ? "Daily mood" : "Momentary emotion") • valence \(String(format: "%.2f", valence))"
}
}
struct DryRunResult {
let drafts: [StateOfMindDraft]
let warnings: [String]
let errors: [String]
}