WIP http client

Roughly based on the Amtraker node library so this and the models will eventually be spun off as one too
This commit is contained in:
Tony Bark 2026-08-22 16:39:39 -04:00
parent 474bca2cc2
commit af3f658d99

View file

@ -0,0 +1,34 @@
import Foundation
enum AmtrakError: Error {
case invalidURL(String)
case invalidResponse
case httpStatus(Int)
case stationNotFound(String)
}
struct AmtrakClient {
var decoder = JSONDecoder()
let stationBaseURL = "https://api.amtraker.com/v3/stations"
let trainsBaseURL = "https://api.amtraker.com/v3/trains"
let staleBaseURL = "https://api.amtraker.com/v3/stale"
func get<T: Decodable>(_ urlString: String) async throws -> T {
guard let url = URL(string: urlString) else {
throw AmtrakError.invalidURL(urlString)
}
let (data, reponse) = try await URLSession.shared.data(from: url)
guard let http = reponse as? HTTPURLResponse else {
throw AmtrakError.invalidResponse
}
guard (200..<300).contains(http.statusCode) else {
throw AmtrakError.httpStatus(http.statusCode)
}
return try decoder.decode(T.self, from: data)
}
}