Skip to content

Commit 338b3f3

Browse files
committed
Adds better error handling for debugging
1 parent 086444d commit 338b3f3

File tree

1 file changed

+63
-7
lines changed

1 file changed

+63
-7
lines changed

Sources/PerplexityApiSwift/PerplexityApiSwift.swift

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,79 @@ public class PerplexityApiSwift {
3737
frequencyPenalty: 1
3838
)
3939

40-
request.httpBody = try JSONEncoder().encode(body)
40+
// Log request details
41+
print("Request URL: \(url)")
42+
print("Request Headers:")
43+
request.allHTTPHeaderFields?.forEach { key, value in
44+
print("\(key): \(value)")
45+
}
46+
47+
do {
48+
let encoder = JSONEncoder()
49+
encoder.outputFormatting = .prettyPrinted
50+
let jsonData = try encoder.encode(body)
51+
request.httpBody = jsonData
52+
53+
print("Request Body:")
54+
if let jsonString = String(data: jsonData, encoding: .utf8) {
55+
print(jsonString)
56+
}
57+
} catch {
58+
throw PerplexityError.encodingError(error)
59+
}
4160

4261
let (data, response) = try await URLSession.shared.data(for: request)
4362

44-
guard let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode else {
45-
throw PerplexityError.invalidResponse(statusCode: (response as? HTTPURLResponse)?.statusCode ?? 500)
63+
guard let httpResponse = response as? HTTPURLResponse else {
64+
throw PerplexityError.invalidResponse(statusCode: 0)
65+
}
66+
67+
print("Response Status Code: \(httpResponse.statusCode)")
68+
print("Response Headers:")
69+
httpResponse.allHeaderFields.forEach { key, value in
70+
print("\(key): \(value)")
71+
}
72+
73+
print("Response Body:")
74+
if let responseString = String(data: data, encoding: .utf8) {
75+
print(responseString)
4676
}
4777

48-
let perplexityResponse = try JSONDecoder().decode(PerplexityResponse.self, from: data)
49-
return perplexityResponse
78+
if !(200...299).contains(httpResponse.statusCode) {
79+
throw PerplexityError.apiError(statusCode: httpResponse.statusCode, data: data)
80+
}
81+
82+
do {
83+
let perplexityResponse = try JSONDecoder().decode(PerplexityResponse.self, from: data)
84+
return perplexityResponse
85+
} catch {
86+
throw PerplexityError.decodingError(error)
87+
}
5088
}
5189
}
5290

5391
// MARK: - Error Handling
5492

55-
public enum PerplexityError: Error {
93+
public enum PerplexityError: Error, LocalizedError {
5694
case tokenNotSet
5795
case invalidResponse(statusCode: Int)
58-
case invalidResponseFormat
96+
case apiError(statusCode: Int, data: Data)
97+
case encodingError(Error)
98+
case decodingError(Error)
99+
100+
public var errorDescription: String? {
101+
switch self {
102+
case .tokenNotSet:
103+
return "API token not set"
104+
case .invalidResponse(let statusCode):
105+
return "Invalid response (Status \(statusCode))"
106+
case .apiError(let statusCode, let data):
107+
let message = String(data: data, encoding: .utf8) ?? "No error message"
108+
return "API error (Status \(statusCode)): \(message)"
109+
case .encodingError(let error):
110+
return "Error encoding request: \(error.localizedDescription)"
111+
case .decodingError(let error):
112+
return "Error decoding response: \(error.localizedDescription)"
113+
}
114+
}
59115
}

0 commit comments

Comments
 (0)