Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Commit 9261125

Browse files
committed
Merge branch 'feature/error_message'
# Conflicts: # README.md # Sources/RxRetroSwift/Protocols/HasErrorInfo.swift # Sources/RxRetroSwift/Services/RequestCaller.swift
2 parents c6329c9 + 9c02c03 commit 9261125

File tree

4 files changed

+65
-40
lines changed

4 files changed

+65
-40
lines changed

Example/RxRetroSwift/Models/ErrorModel.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import Foundation
1010
import RxRetroSwift
1111

12-
struct ErrorModel:HasErrorCode, Codable {
12+
struct ErrorModel:HasErrorInfo, Codable {
1313

1414
var errorCode: Int?
15+
var errorDetail: String?
1516
}

README.md

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,34 +34,34 @@ Example:
3434

3535
let caller = RequestCaller(config: URLSessionConfiguration.default)
3636

37-
func fetchUser(byUserId userId) throws -> Observable<Result<User, ErrorModel>> {
37+
func fetchUser(byUserId userId) -> Observable<Result<User, ErrorModel>> {
3838
let request:URLRequest = RequestModel(
3939
httpMethod: .get,
4040
path: "v1/users/\(userId)")
4141
.asURLRequest()
42-
return try caller.call(request)
42+
return caller.call(request)
4343
}
4444
```
4545

4646
**Let say it’s an array of users; since Array conforms to Codable, all you have to do is specify the type to be `[User]`.**
4747

4848
Example:
4949
```Swift
50-
func fetchUsers() throws -> Observable<Result<[User], ErrorModel>> {
50+
func fetchUsers() -> Observable<Result<[User], ErrorModel>> {
5151
let request:URLRequest = RequestModel(
5252
httpMethod: .get,
5353
path: "v1/users")
5454
.asURLRequest()
55-
return try caller.call(request)
55+
return caller.call(request)
5656
}
5757
```
5858

5959
About handling ResponseError:
6060

61-
**RxRetroSwift** provided a typealias **ErrorCodable** which is a combination of [HasErrorCode](Sources/Protocols/HasErrorCode.swift) and [Decodable](https://developer.apple.com/documentation/swift/decodable) protocol:
61+
**RxRetroSwift** provided a typealias **ErrorCodable** which is a combination of [HasErrorInfo](Sources/Protocols/HasErrorInfo.swift) and [Decodable](https://developer.apple.com/documentation/swift/decodable) protocol:
6262

6363
```Swift
64-
public typealias CodableError = Decodable & HasErrorCode
64+
public typealias DecodableError = Decodable & HasErrorInfo
6565
```
6666

6767
For example, the json error response of your login request is
@@ -91,7 +91,7 @@ How about dealing to a request that don't expect to return an object or model?
9191

9292
```swift
9393

94-
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest) throws
94+
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest)
9595
-> Observable<Result<RawResponse, DecodableErrorModel>>
9696
```
9797

@@ -162,69 +162,69 @@ class APIClient {
162162
RequestModel.defaults.baseUrl = "https://jsonplaceholder.typicode.com"
163163
}
164164

165-
func fetchPosts() throws -> Observable<Result<[Post], ErrorModel>> {
165+
func fetchPosts() -> Observable<Result<[Post], ErrorModel>> {
166166
let request = RequestModel(
167167
httpMethod: .get,
168168
path: "posts")
169169
.asURLRequest()
170170

171-
return try caller.call(request)
171+
return caller.call(request)
172172
}
173173

174-
func insertPost(post:Post) throws -> Observable<Result<Post, ErrorModel>> {
174+
func insertPost(post:Post) -> Observable<Result<Post, ErrorModel>> {
175175
let request = RequestModel(
176176
httpMethod: .post,
177177
path: "posts",
178178
payload: post.dictionaryValue)
179179
.asURLRequest()
180180

181-
return try caller.call(request)
181+
return caller.call(request)
182182
}
183183

184-
func fetchComments() throws -> Observable<Result<[Comment], ErrorModel>> {
184+
func fetchComments() -> Observable<Result<[Comment], ErrorModel>> {
185185
let request = RequestModel(
186186
httpMethod: .get,
187187
path: "comments")
188188
.asURLRequest()
189189

190-
return try caller.call(request)
190+
return caller.call(request)
191191
}
192192

193-
func fetchAlbums() throws -> Observable<Result<[Album], ErrorModel>> {
193+
func fetchAlbums() -> Observable<Result<[Album], ErrorModel>> {
194194
let request = RequestModel(
195195
httpMethod: .get,
196196
path: "albums")
197197
.asURLRequest()
198198

199-
return try caller.call(request)
199+
return caller.call(request)
200200
}
201201

202-
func fetchPhotos() throws -> Observable<Result<[Photo], ErrorModel>> {
202+
func fetchPhotos() -> Observable<Result<[Photo], ErrorModel>> {
203203
let request = RequestModel(
204204
httpMethod: .get,
205205
path: "photos")
206206
.asURLRequest()
207207

208-
return try caller.call(request)
208+
return caller.call(request)
209209
}
210210

211-
func fetchTodos() throws -> Observable<Result<[Todo], ErrorModel>> {
211+
func fetchTodos() -> Observable<Result<[Todo], ErrorModel>> {
212212
let request = RequestModel(
213213
httpMethod: .get,
214214
path: "todos")
215215
.asURLRequest()
216216

217-
return try caller.call(request)
217+
return caller.call(request)
218218
}
219219

220-
func fetchUsers() throws -> Observable<Result<[User],ErrorModel>> {
220+
func fetchUsers() -> Observable<Result<[User],ErrorModel>> {
221221

222222
let request = RequestModel(
223223
httpMethod: .get,
224224
path: "users")
225225
.asURLRequest()
226226

227-
return try caller.call(request)
227+
return caller.call(request)
228228
}
229229
}
230230
```
@@ -305,3 +305,7 @@ Michael Henry Pantaleon, me@iamkel.net
305305
## License
306306

307307
RxRetroSwift is available under the MIT license. See the LICENSE file for more info.
308+
309+
310+
311+

Sources/RxRetroSwift/Protocols/HasErrorCode.swift renamed to Sources/RxRetroSwift/Protocols/HasErrorInfo.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77

88
import Foundation
99

10-
public protocol HasErrorCode {
10+
public protocol HasErrorInfo {
1111

1212
var errorCode:Int? { get set }
13+
var errorDetail:String? { get set }
14+
15+
init()
1316
}

Sources/RxRetroSwift/Services/RequestCaller.swift

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Foundation
99
import RxSwift
1010
import RxCocoa
1111

12-
public typealias DecodableError = Decodable & HasErrorCode
12+
public typealias DecodableError = Decodable & HasErrorInfo
1313

1414
public class RequestCaller{
1515

@@ -26,7 +26,7 @@ public class RequestCaller{
2626
self.config = config
2727
}
2828

29-
public func call<ItemModel:Decodable, DecodableErrorModel:DecodableError>(_ request: URLRequest) throws
29+
public func call<ItemModel:Decodable, DecodableErrorModel:DecodableError>(_ request: URLRequest)
3030
-> Observable<Result<ItemModel, DecodableErrorModel>> {
3131

3232
return Observable.create { [weak self] observer in
@@ -38,13 +38,21 @@ public class RequestCaller{
3838

3939
if let httpResponse = response as? HTTPURLResponse{
4040
let statusCode = httpResponse.statusCode
41-
if (200...399).contains(statusCode) {
42-
let objs = try! _self.decoder.decode(ItemModel.self, from: data!)
43-
observer.onNext(Result.successful(objs))
44-
} else {
45-
var error = try! _self.decoder.decode(DecodableErrorModel.self, from: data!)
46-
error.errorCode = statusCode
47-
observer.onNext(Result.failure(error))
41+
42+
do {
43+
if (200...399).contains(statusCode) {
44+
let objs = try _self.decoder.decode(ItemModel.self, from: data!)
45+
observer.onNext(Result.successful(objs))
46+
} else {
47+
var error = try _self.decoder.decode(DecodableErrorModel.self, from: data!)
48+
error.errorCode = statusCode
49+
observer.onNext(Result.failure(error))
50+
}
51+
} catch {
52+
var decodingError = DecodableErrorModel()
53+
decodingError.errorCode = -1
54+
decodingError.errorDetail = error.localizedDescription
55+
observer.onNext(Result.failure(decodingError))
4856
}
4957
}
5058
observer.on(.completed)
@@ -56,7 +64,7 @@ public class RequestCaller{
5664
}
5765
}
5866

59-
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest) throws
67+
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest)
6068
-> Observable<Result<RawResponse, DecodableErrorModel>> {
6169

6270
return Observable.create { [weak self] observer in
@@ -68,13 +76,22 @@ public class RequestCaller{
6876

6977
if let httpResponse = response as? HTTPURLResponse{
7078
let statusCode = httpResponse.statusCode
71-
if (200...399).contains(statusCode) {
72-
let plainResponse = RawResponse(statusCode: statusCode, data: data)
73-
observer.onNext(Result.successful(plainResponse))
74-
} else {
75-
var error = try! _self.decoder.decode(DecodableErrorModel.self, from: data!)
76-
error.errorCode = statusCode
77-
observer.onNext(Result.failure(error))
79+
80+
do {
81+
if (200...399).contains(statusCode) {
82+
let plainResponse = RawResponse(statusCode: statusCode, data: data)
83+
observer.onNext(Result.successful(plainResponse))
84+
} else {
85+
var error = try _self.decoder.decode(DecodableErrorModel.self, from: data!)
86+
error.errorCode = statusCode
87+
observer.onNext(Result.failure(error))
88+
}
89+
90+
} catch {
91+
var decodingError = DecodableErrorModel()
92+
decodingError.errorCode = -1
93+
decodingError.errorDetail = error.localizedDescription
94+
observer.onNext(Result.failure(decodingError))
7895
}
7996
observer.on(.completed)
8097
}

0 commit comments

Comments
 (0)