import Foundation import Observation /// `repo create [--private]`. @Observable @MainActor final class RepoCreateViewModel { private(set) var working = false private(set) var errorMessage: String? private let client: GitbayClient init(client: GitbayClient) { self.client = client } nonisolated private struct Created: Decodable, Sendable { let path: String } /// Returns the created repo's path, or nil with `errorMessage` set. func create(path: String, isPrivate: Bool) async -> String? { working = true errorMessage = nil defer { working = false } do { var argv = ["repo", "create", path.trimmingCharacters(in: .whitespaces)] if isPrivate { argv.append("--private") } let created = try await client.run(argv, as: Created.self) return created?.path } catch let error as GitbayError { errorMessage = error.userFacingMessage } catch { errorMessage = GitbayError.transport(error).userFacingMessage } return nil } }