a native ios client for gitbay

client ios swift

https://gitbay.org

gitbay/Repos/RepoCreateViewModel.swift

main
gitbay-ios/gitbay/Repos/RepoCreateViewModel.swift history · blame · raw

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}