Organize files
This commit is contained in:
@@ -1,227 +0,0 @@
|
||||
import Foundation
|
||||
import HealthKit
|
||||
import HealthKitExtensions
|
||||
|
||||
func insertExamplesOfAllTypes() async throws {
|
||||
|
||||
let store = HealthStore()
|
||||
|
||||
guard try await requestAllPermissions(in: store) else {
|
||||
return
|
||||
}
|
||||
|
||||
var startDate = Date(timeIntervalSinceReferenceDate: 700_000_000)
|
||||
|
||||
try await insertCategoryTypes(in: store, startDate: &startDate)
|
||||
try await insertQuantityTypes(in: store, startDate: &startDate)
|
||||
}
|
||||
|
||||
func requestAllPermissions(in store: HealthStore) async throws -> Bool {
|
||||
|
||||
let writable: [HKSampleContainer.Type] = HKQuantityType.writableTypes + HKCorrelationType.writableTypes + HKCategoryType.writableTypes
|
||||
let readable: [HKObjectContainer.Type] = HKQuantityType.readableTypes + HKCorrelationType.readableTypes + HKCategoryType.readableTypes
|
||||
|
||||
try await store.requestAuthorization(toShare: writable, read: readable)
|
||||
|
||||
var hasAllPermissions = true
|
||||
writable.forEach {
|
||||
if store.authorizationStatus(for: $0) != .sharingAuthorized {
|
||||
print("Missing permission for \($0.objectType)")
|
||||
hasAllPermissions = false
|
||||
}
|
||||
}
|
||||
return hasAllPermissions
|
||||
}
|
||||
|
||||
private func insertCategoryTypes(in store: HealthStore, startDate: inout Date) async throws {
|
||||
|
||||
func make<T>(convert: (Date, Date) -> T) -> T where T: HKObjectContainer {
|
||||
let result = convert(startDate, startDate.addingTimeInterval(1))
|
||||
print("\(startDate.timeIntervalSinceReferenceDate): \(T.objectType)")
|
||||
startDate.addTimeInterval(1)
|
||||
return result
|
||||
}
|
||||
let categorySamples: [HKCategorySampleContainer] = [
|
||||
make { MindfulSession(start: $0, end: $1) },
|
||||
make { HandwashingEvent(start: $0, end: $1) },
|
||||
make { ToothbrushingEvent(start: $0, end: $1) },
|
||||
make { CervicalMucusQuality(value: .creamy, start: $0, end: $1) },
|
||||
make { Contraceptive(value: .implant, start: $0, end: $1) },
|
||||
make { IntermenstrualBleeding(start: $0, end: $1) },
|
||||
make { Lactation(start: $0, end: $1) },
|
||||
make { MenstrualFlow(value: .heavy, cycleStart: true, start: $0, end: $1) },
|
||||
make { OvulationTestResult(value: .negative, start: $0, end: $1) },
|
||||
make { Pregnancy(start: $0, end: $1) },
|
||||
make { PregnancyTestResult(value: .positive, start: $0, end: $1) },
|
||||
make { SexualActivity(protectionUsed: true, start: $0, end: $1) },
|
||||
make { SleepAnalysis(value: .asleepREM, start: $0, end: $1) },
|
||||
make { AbdominalCramps(value: .moderate, start: $0, end: $1) },
|
||||
make { Acne(value: .moderate, start: $0, end: $1) },
|
||||
make { AppetiteChanges(value: .decreased, start: $0, end: $1) },
|
||||
make { BladderIncontinence(value: .moderate, start: $0, end: $1) },
|
||||
make { Bloating(value: .moderate, start: $0, end: $1) },
|
||||
make { BreastPain(value: .moderate, start: $0, end: $1) },
|
||||
make { ChestTightnessOrPain(value: .moderate, start: $0, end: $1) },
|
||||
make { Chills(value: .moderate, start: $0, end: $1) },
|
||||
make { Constipation(value: .moderate, start: $0, end: $1) },
|
||||
make { Coughing(value: .moderate, start: $0, end: $1) },
|
||||
make { Diarrhea(value: .moderate, start: $0, end: $1) },
|
||||
make { Dizziness(value: .moderate, start: $0, end: $1) },
|
||||
make { DrySkin(value: .moderate, start: $0, end: $1) },
|
||||
make { Fainting(value: .moderate, start: $0, end: $1) },
|
||||
make { Fatigue(value: .moderate, start: $0, end: $1) },
|
||||
make { Fever(value: .moderate, start: $0, end: $1) },
|
||||
make { GeneralizedBodyAche(value: .moderate, start: $0, end: $1) },
|
||||
make { HairLoss(value: .moderate, start: $0, end: $1) },
|
||||
make { Headache(value: .moderate, start: $0, end: $1) },
|
||||
make { Heartburn(value: .moderate, start: $0, end: $1) },
|
||||
make { HotFlashes(value: .moderate, start: $0, end: $1) },
|
||||
make { LossOfSmell(value: .moderate, start: $0, end: $1) },
|
||||
make { LossOfTaste(value: .moderate, start: $0, end: $1) },
|
||||
make { LowerBackPain(value: .moderate, start: $0, end: $1) },
|
||||
make { MemoryLapse(value: .moderate, start: $0, end: $1) },
|
||||
make { MoodChanges(value: .present, start: $0, end: $1) },
|
||||
make { Nausea(value: .moderate, start: $0, end: $1) },
|
||||
make { NightSweats(value: .moderate, start: $0, end: $1) },
|
||||
make { PelvicPain(value: .moderate, start: $0, end: $1) },
|
||||
make { RapidPoundingOrFlutteringHeartbeat(value: .moderate, start: $0, end: $1) },
|
||||
make { RunnyNose(value: .moderate, start: $0, end: $1) },
|
||||
make { ShortnessOfBreath(value: .moderate, start: $0, end: $1) },
|
||||
make { SinusCongestion(value: .moderate, start: $0, end: $1) },
|
||||
make { SkippedHeartbeat(value: .moderate, start: $0, end: $1) },
|
||||
make { SleepChanges(value: .present, start: $0, end: $1) },
|
||||
make { SoreThroat(value: .moderate, start: $0, end: $1) },
|
||||
make { VaginalDryness(value: .moderate, start: $0, end: $1) },
|
||||
make { Vomiting(value: .moderate, start: $0, end: $1) },
|
||||
make { Wheezing(value: .moderate, start: $0, end: $1) },
|
||||
]
|
||||
|
||||
print("Saving...")
|
||||
try await store.save(categorySamples)
|
||||
print("Done.")
|
||||
}
|
||||
|
||||
private func insertQuantityTypes(in store: HealthStore, startDate: inout Date) async throws {
|
||||
|
||||
func make<T>(convert: (Date, Date) -> T) -> T where T: HKObjectContainer {
|
||||
let result = convert(startDate, startDate.addingTimeInterval(1))
|
||||
print("\(startDate.timeIntervalSinceReferenceDate): \(T.objectType)")
|
||||
startDate.addTimeInterval(1)
|
||||
return result
|
||||
}
|
||||
|
||||
let samples: [HKQuantitySampleContainer] = [
|
||||
make { BodyFatPercentage(value: 10.0, start: $0, end: $1) },
|
||||
make { BodyMass(value: 80.0, start: $0, end: $1) },
|
||||
make { BodyMassIndex(value: 25.0, start: $0, end: $1) },
|
||||
make { ElectrodermalActivity(value: 6.0, start: $0, end: $1) },
|
||||
make { Height(value: 1.80, start: $0, end: $1) },
|
||||
make { LeanBodyMass(value: 65.0, start: $0, end: $1) },
|
||||
make { WaistCircumference(value: 1.0, start: $0, end: $1) },
|
||||
make { ActiveEnergyBurned(value: 1.0, start: $0, end: $1) },
|
||||
make { BasalEnergyBurned(value: 1.0, start: $0, end: $1) },
|
||||
//make { CyclingCadence(value: 1.0, start: $0, end: $1) },
|
||||
//make { CyclingFunctionalThresholdPower(value: 1.0, start: $0, end: $1) },
|
||||
//make { CyclingPower(value: 1.0, start: $0, end: $1) },
|
||||
//make { CyclingSpeed(value: 1.0, start: $0, end: $1) },
|
||||
make { DistanceCycling(value: 1.0, start: $0, end: $1) },
|
||||
make { DistanceDownhillSnowSports(value: 1.0, start: $0, end: $1) },
|
||||
make { DistanceSwimming(value: 1.0, start: $0, end: $1) },
|
||||
make { DistanceWalkingRunning(value: 1.0, start: $0, end: $1) },
|
||||
make { DistanceWheelchair(value: 1.0, start: $0, end: $1) },
|
||||
make { FlightsClimbed(value: 1.0, start: $0, end: $1) },
|
||||
//make { PhysicalEffort(value: 1.0, start: $0, end: $1) },
|
||||
make { PushCount(value: 1.0, start: $0, end: $1) },
|
||||
make { RunningPower(value: 1.0, start: $0, end: $1) },
|
||||
make { RunningSpeed(value: 1.0, start: $0, end: $1) },
|
||||
make { StepCount(value: 1.0, start: $0, end: $1) },
|
||||
make { SwimmingStrokeCount(value: 1.0, start: $0, end: $1) },
|
||||
make { UnderwaterDepth(value: 1.0, start: $0, end: $1) },
|
||||
make { EnvironmentalAudioExposure(value: 1.0, start: $0, end: $1) },
|
||||
make { EnvironmentalSoundReduction(value: 1.0, start: $0, end: $1) },
|
||||
make { HeadphoneAudioExposure(value: 1.0, start: $0, end: $1) },
|
||||
make { HeartRate(countsPerSecond: 1.0, motionContext: .sedentary, start: $0, end: $1) },
|
||||
make { HeartRateRecoveryOneMinute(value: 1.0, start: $0, end: $1) },
|
||||
make { HeartRateVariabilitySDNN(value: 1.0, start: $0, end: $1) },
|
||||
make { PeripheralPerfusionIndex(value: 1.0, start: $0, end: $1) },
|
||||
make { RestingHeartRate(value: 1.0, start: $0, end: $1) },
|
||||
make { Vo2Max(value: 1.0, testType: .maxExercise, start: $0, end: $1) },
|
||||
make { RunningGroundContactTime(value: 1.0, start: $0, end: $1) },
|
||||
make { RunningStrideLength(value: 1.0, start: $0, end: $1) },
|
||||
make { RunningVerticalOscillation(value: 1.0, start: $0, end: $1) },
|
||||
make { SixMinuteWalkTestDistance(value: 1.0, start: $0, end: $1) },
|
||||
make { StairAscentSpeed(value: 1.0, start: $0, end: $1) },
|
||||
make { StairDescentSpeed(value: 1.0, start: $0, end: $1) },
|
||||
make { WalkingDoubleSupportPercentage(value: 1.0, start: $0, end: $1) },
|
||||
make { WalkingSpeed(value: 1.0, start: $0, end: $1) },
|
||||
make { WalkingStepLength(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryBiotin(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryCaffeine(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryCalcium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryCarbohydrates(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryChloride(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryCholesterol(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryChromium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryCopper(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryEnergyConsumed(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFatMonounsaturated(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFatPolyunsaturated(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFatSaturated(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFatTotal(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFiber(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryFolate(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryIodine(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryIron(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryMagnesium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryManganese(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryMolybdenum(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryNiacin(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryPantothenicAcid(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryPhosphorus(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryPotassium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryProtein(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryRiboflavin(value: 1.0, start: $0, end: $1) },
|
||||
make { DietarySelenium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietarySodium(value: 1.0, start: $0, end: $1) },
|
||||
make { DietarySugar(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryThiamin(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminA(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminB6(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminB12(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminC(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminD(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminE(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryVitaminK(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryWater(value: 1.0, start: $0, end: $1) },
|
||||
make { DietaryZinc(value: 1.0, start: $0, end: $1) },
|
||||
make { BloodPressureDiastolic(value: 1.0, start: $0, end: $1) },
|
||||
make { BloodPressureSystolic(value: 1.0, start: $0, end: $1) },
|
||||
make { InsulinDelivery(amount: 1.0, reason: .basal, start: $0, end: $1) },
|
||||
make { NumberOfAlcoholicBeverages(value: 1.0, start: $0, end: $1) },
|
||||
make { NumberOfTimesFallen(value: 1.0, start: $0, end: $1) },
|
||||
//make { TimeInDaylight(value: 1.0, start: $0, end: $1) },
|
||||
make { UvExposure(value: 1.0, start: $0, end: $1) },
|
||||
make { WaterTemperature(value: 1.0, start: $0, end: $1) },
|
||||
make { BasalBodyTemperature(value: 1.0, start: $0, end: $1) },
|
||||
make { ForcedExpiratoryVolume1(value: 1.0, start: $0, end: $1) },
|
||||
make { ForcedVitalCapacity(value: 1.0, start: $0, end: $1) },
|
||||
make { InhalerUsage(value: 1.0, start: $0, end: $1) },
|
||||
make { OxygenSaturation(value: 1.0, start: $0, end: $1) },
|
||||
make { PeakExpiratoryFlowRate(value: 1.0, start: $0, end: $1) },
|
||||
make { RespiratoryRate(value: 1.0, start: $0, end: $1) },
|
||||
make { BloodGlucose(value: 1.0, start: $0, end: $1) },
|
||||
make { BodyTemperature(value: 1.0, start: $0, end: $1) },
|
||||
]
|
||||
|
||||
let allowed = Set(HKQuantityType.writableTypes.map { $0.quantitySampleType })
|
||||
|
||||
samples.forEach {
|
||||
if !allowed.contains($0.quantitySampleType) {
|
||||
print("Can't write: \($0.quantitySampleType)")
|
||||
}
|
||||
}
|
||||
|
||||
print("Saving...")
|
||||
try await store.save(samples)
|
||||
print("Done.")
|
||||
}
|
Reference in New Issue
Block a user