gitbay/Repos/RepoCreateViewModel.swift
39 lines · 1124 bytes
1import Foundation
2import Observation
3
4/// `repo create <owner/name> [--private]`.
5@Observable
6@MainActor
7final class RepoCreateViewModel {
8
9 private(set) var working = false
10 private(set) var errorMessage: String?
11
12 private let client: GitbayClient
13
14 init(client: GitbayClient) {
15 self.client = client
16 }
17
18 nonisolated private struct Created: Decodable, Sendable {
19 let path: String
20 }
21
22 /// Returns the created repo's path, or nil with `errorMessage` set.
23 func create(path: String, isPrivate: Bool) async -> String? {
24 working = true
25 errorMessage = nil
26 defer { working = false }
27 do {
28 var argv = ["repo", "create", path.trimmingCharacters(in: .whitespaces)]
29 if isPrivate { argv.append("--private") }
30 let created = try await client.run(argv, as: Created.self)
31 return created?.path
32 } catch let error as GitbayError {
33 errorMessage = error.userFacingMessage
34 } catch {
35 errorMessage = GitbayError.transport(error).userFacingMessage
36 }
37 return nil
38 }
39}