112 lines
2.4 KiB
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]
|
|
}
|