import Foundation import Observation /// `issue create --title --file -`. @Observable @MainActor final class IssueCreateViewModel { private(set) var working = false private(set) var errorMessage: String? private let client: GitbayClient let repoPath: String init(client: GitbayClient, repoPath: String) { self.client = client self.repoPath = repoPath } nonisolated private struct Created: Decodable, Sendable { let number: Int64 } /// Returns the new issue's number, or nil with `errorMessage` set. func create(title: String, body: String) async -> Int64? { working = true errorMessage = nil defer { working = false } do { var argv = ["issue", "create", repoPath, "--title", title] var stdin: String? if !body.isEmpty { argv.append(contentsOf: ["--file", "-"]) stdin = body } let created = try await client.run(argv, stdin: stdin, as: Created.self) return created?.number } catch let error as GitbayError { errorMessage = error.userFacingMessage } catch { errorMessage = GitbayError.transport(error).userFacingMessage } return nil } }