Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Wisp/Services/GitHubAPIClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ struct GitHubAPIClient: Sendable {
let token: String?

func fetchUserProfile() async throws -> GitHubUser {
let url = URL(string: "https://api.github.com/user")!
guard let url = URL(string: "https://api.github.com/user") else { throw URLError(.badURL) }
let data = try await performRequest(url: url)
let json = try JSONDecoder().decode(UserJSON.self, from: data)
return GitHubUser(name: json.name, email: json.email, login: json.login)
}

func fetchPrimaryEmail() async throws -> String? {
let url = URL(string: "https://api.github.com/user/emails")!
guard let url = URL(string: "https://api.github.com/user/emails") else { throw URLError(.badURL) }
let data = try await performRequest(url: url)
let emails = try JSONDecoder().decode([EmailJSON].self, from: data)
return emails.first(where: { $0.primary })?.email ?? emails.first?.email
}

func fetchUserRepos() async throws -> [GitHubRepo] {
guard token != nil else { return [] }
let url = URL(string: "https://api.github.com/user/repos?sort=pushed&per_page=50")!
guard let url = URL(string: "https://api.github.com/user/repos?sort=pushed&per_page=50") else { throw URLError(.badURL) }
let data = try await performRequest(url: url)
return try decodeRepos(from: data)
}
Expand Down
18 changes: 14 additions & 4 deletions Wisp/Services/SpritesAPIClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,10 @@ final class SpritesAPIClient {
.replacingOccurrences(of: "+", with: "%2B")
}

return ExecSession(url: components.url!, token: spritesToken ?? "")
guard let url = components.url else {
preconditionFailure("URLComponents with scheme=wss, host=api.sprites.dev failed to produce URL")
}
return ExecSession(url: url, token: spritesToken ?? "")
}

func attachExecSession(spriteName: String, execSessionId: String) -> ExecSession {
Expand All @@ -136,7 +139,10 @@ final class SpritesAPIClient {
components.host = "api.sprites.dev"
components.path = "/v1/sprites/\(spriteName)/exec/\(execSessionId)"

return ExecSession(url: components.url!, token: spritesToken ?? "")
guard let url = components.url else {
preconditionFailure("URLComponents with scheme=wss, host=api.sprites.dev failed to produce URL")
}
return ExecSession(url: url, token: spritesToken ?? "")
}

// MARK: - Services
Expand Down Expand Up @@ -318,7 +324,9 @@ extension SpritesAPIClient {
throw AppError.noToken
}

var components = URLComponents(string: baseURL + "/sprites/\(spriteName)/fs/read")!
guard var components = URLComponents(string: baseURL + "/sprites/\(spriteName)/fs/read") else {
throw AppError.invalidURL
}
components.queryItems = [
URLQueryItem(name: "path", value: remotePath),
]
Expand Down Expand Up @@ -359,7 +367,9 @@ extension SpritesAPIClient {
throw AppError.noToken
}

var components = URLComponents(string: baseURL + "/sprites/\(spriteName)/fs/write")!
guard var components = URLComponents(string: baseURL + "/sprites/\(spriteName)/fs/write") else {
throw AppError.invalidURL
}
components.queryItems = [
URLQueryItem(name: "path", value: remotePath),
URLQueryItem(name: "mkdir", value: "true"),
Expand Down
Loading