TeraDiagnosticsStore.swift (1693B)
1 import Foundation 2 import RadrootsKit 3 4 @MainActor 5 final class TeraDiagnosticsStore: ObservableObject { 6 @Published var preparedExport: RadrootsPreparedExportDocument? 7 @Published private(set) var isPreparing = false 8 @Published private(set) var message: String? 9 10 private let coordinator: TeraLifecycleCoordinator 11 private var activeExport: RadrootsPreparedExportDocument? 12 13 init(coordinator: TeraLifecycleCoordinator) { 14 self.coordinator = coordinator 15 } 16 17 func prepare(snapshot: TeraRuntimeSnapshot, bundle: Bundle = .main) async { 18 guard !isPreparing, preparedExport == nil, activeExport == nil else { return } 19 isPreparing = true 20 message = nil 21 defer { isPreparing = false } 22 do { 23 let export = try await coordinator.prepareDiagnostics( 24 snapshot: snapshot, 25 appVersion: bundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String 26 ?? "0", 27 appBuild: bundle.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "0", 28 phase: "running" 29 ) 30 activeExport = export 31 preparedExport = export 32 } catch { 33 activeExport = nil 34 preparedExport = nil 35 message = TeraUserMessages.text(.diagnosticsPrepareFailed) 36 } 37 } 38 39 func completeExport(_ result: Result<RadrootsExportDocumentResult, Error>) { 40 let export = activeExport 41 activeExport = nil 42 preparedExport = nil 43 switch result { 44 case .success: 45 message = TeraUserMessages.text(.diagnosticsExportSucceeded) 46 case .failure: 47 message = TeraUserMessages.text(.diagnosticsExportFailed) 48 } 49 guard let export else { return } 50 Task { await coordinator.releaseDiagnostics(export) } 51 } 52 }