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

Commit 9c02c03

Browse files
committed
update removing throwable
1 parent 566d1e5 commit 9c02c03

File tree

5 files changed

+66
-34
lines changed

5 files changed

+66
-34
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: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88

99
## What does it do?
1010

11-
What does it do?
11+
It simplifies your **RESTful API** calls, automatically convert the `HttpResponse` into specified Model as well as the Error using the new apple ’s [Codable](https://developer.apple.com/documentation/swift/codable) feature.
1212

13-
It simplifies your RESTful API calls, automatically convert the `HttpResponse` into specified Model as well as the Error using the new apple ’s [Codable](https://developer.apple.com/documentation/swift/codable) feature.
14-
15-
For example in a request for fetching specific user information and you have a `User` model, all you have to do is make the User model conforms to [Codable] and specify it when using the [RequestCaller](Sources/Services/RequestCaller.swift).
13+
For example in a request for fetching specific user information and you have a `User` model, all you have to do is make the User model conforms to [Codable](https://developer.apple.com/documentation/swift/codable) and specify it when using the [RequestCaller](Sources/Services/RequestCaller.swift).
1614

1715
```json
1816
{
@@ -60,10 +58,10 @@ func fetchUsers() -> Observable<Result<[User], ErrorModel>> {
6058

6159
About handling ResponseError:
6260

63-
**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:
6462

6563
```Swift
66-
public typealias CodableError = Decodable & HasErrorCode
64+
public typealias DecodableError = Decodable & HasErrorInfo
6765
```
6866

6967
For example, the json error response of your login request is
@@ -87,6 +85,30 @@ struct ErrorModel {
8785
}
8886
```
8987

88+
How about dealing to a request that don't expect to return an object or model?
89+
90+
**RxRetroSwift** provide a method that will return Observable<Result<[RawResponse](Sources/RxRetroSwift/Models/RawResponse.swift)>, DecodableErrorModel>>.
91+
92+
```swift
93+
94+
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest)
95+
-> Observable<Result<RawResponse, DecodableErrorModel>>
96+
```
97+
98+
```swift
99+
100+
public struct RawResponse {
101+
102+
public var statusCode:Int
103+
public var data:Data?
104+
105+
init(statusCode:Int, data:Data?) {
106+
self.statusCode = statusCode
107+
self.data = data
108+
}
109+
}
110+
```
111+
90112
## Example
91113

92114
To run the example project, clone the repo, and run `pod install` from the Example directory first.

Sources/RxRetroSwift/Models/PlainResponse.swift renamed to Sources/RxRetroSwift/Models/RawResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// PlainResponse.swift
2+
// RawResponse.swift
33
// Nimble
44
//
55
// Created by Michael Pantaleon on 2018/03/28.

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +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 }
1314

1415
init()
1516
}

Sources/RxRetroSwift/Services/RequestCaller.swift

Lines changed: 33 additions & 25 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

@@ -38,17 +38,21 @@ public class RequestCaller{
3838

3939
if let httpResponse = response as? HTTPURLResponse{
4040
let statusCode = httpResponse.statusCode
41-
if let value = data,
42-
let objs = try? _self.decoder.decode(ItemModel.self, from: value) {
43-
observer.onNext(Result.successful(objs))
44-
} else if let value = data,
45-
var error = try? _self.decoder.decode(DecodableErrorModel.self, from: value) {
46-
error.errorCode = statusCode
47-
observer.onNext(Result.failure(error))
48-
} else {
49-
var error = DecodableErrorModel()
50-
error.errorCode = statusCode
51-
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))
5256
}
5357
}
5458
observer.on(.completed)
@@ -60,7 +64,6 @@ public class RequestCaller{
6064
}
6165
}
6266

63-
6467
public func call<DecodableErrorModel:DecodableError>(_ request: URLRequest)
6568
-> Observable<Result<RawResponse, DecodableErrorModel>> {
6669

@@ -73,20 +76,25 @@ public class RequestCaller{
7376

7477
if let httpResponse = response as? HTTPURLResponse{
7578
let statusCode = httpResponse.statusCode
76-
if (200...399).contains(statusCode) {
77-
let plainResponse = RawResponse(statusCode: statusCode, data: data)
78-
observer.onNext(Result.successful(plainResponse))
79-
} else if let value = data,
80-
var error = try? _self.decoder.decode(DecodableErrorModel.self, from: value) {
81-
error.errorCode = statusCode
82-
observer.onNext(Result.failure(error))
83-
} else {
84-
var error = DecodableErrorModel()
85-
error.errorCode = statusCode
86-
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))
8795
}
96+
observer.on(.completed)
8897
}
89-
observer.on(.completed)
9098
}
9199
task.resume()
92100
return Disposables.create {

0 commit comments

Comments
 (0)