import Foundation import Observation /// `milestone list --state ` — milestones with their progress. @Observable @MainActor final class MilestoneListViewModel { enum StateFilter: String, CaseIterable, Identifiable, Sendable { case open, closed, all var id: String { rawValue } } private(set) var state: LoadState<[Milestone]> = .loading var filter: StateFilter = .open { didSet { guard filter != oldValue else { return } Task { await load() } } } private let client: GitbayClient let repoPath: String init(client: GitbayClient, repoPath: String) { self.client = client self.repoPath = repoPath } func load() async { state = .loading do { let milestones = try await client.readList( ["milestone", "list", repoPath, "--state", filter.rawValue], of: Milestone.self ) state = milestones.isEmpty ? .empty("No \(filter == .all ? "" : filter.rawValue + " ")milestones.") : .loaded(milestones) } catch { state = .from(error) } } }