Skip to content

Commit c3735c0

Browse files
committed
Use try function and Result.flatMap
1 parent 3caf98f commit c3735c0

4 files changed

+20
-34
lines changed

APIKit/APIKit.swift

+7-9
Original file line numberDiff line numberDiff line change
@@ -94,20 +94,18 @@ public class API {
9494
dispatch_async(mainQueue, { handler(.Failure(Box(error))) })
9595
return
9696
}
97-
98-
switch self.responseBodyParser().parseData(data) {
99-
case .Failure(let box):
100-
dispatch_async(mainQueue, { handler(failure(box.unbox)) })
101-
102-
case .Success(let box):
103-
if let response = request.responseFromObject(box.unbox) {
104-
dispatch_async(mainQueue, { handler(success(response)) })
97+
98+
let mappedResponse: Result<T.Response, NSError> = self.responseBodyParser().parseData(data).flatMap { rawResponse in
99+
if let response = request.responseFromObject(rawResponse) {
100+
return success(response)
105101
} else {
106102
let userInfo = [NSLocalizedDescriptionKey: "failed to create model object from raw object."]
107103
let error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo)
108-
dispatch_async(mainQueue, { handler(failure(error)) })
104+
return failure(error)
109105
}
106+
110107
}
108+
dispatch_async(mainQueue, { handler(mappedResponse) })
111109
}
112110

113111
task.resume()

APIKit/RequestBodyBuilder.swift

+5-11
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,14 @@ public enum RequestBodyBuilder {
3535
result = failure(error)
3636
break
3737
}
38-
39-
var error: NSError?
40-
if let data = NSJSONSerialization.dataWithJSONObject(object, options: writingOptions, error: &error) {
41-
result = success(data)
42-
} else {
43-
result = failure(error!)
38+
39+
result = try { error in
40+
return NSJSONSerialization.dataWithJSONObject(object, options: writingOptions, error: error)
4441
}
4542

4643
case .URL(let encoding):
47-
var error: NSError?
48-
if let data = URLEncodedSerialization.dataFromObject(object, encoding: encoding, error: &error) {
49-
result = success(data)
50-
} else {
51-
result = failure(error!)
44+
result = try { error in
45+
return URLEncodedSerialization.dataFromObject(object, encoding: encoding, error: error)
5246
}
5347

5448
case .Custom(let (_, buildBodyFromObject)):

APIKit/ResponseBodyParser.swift

+4-10
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,13 @@ public enum ResponseBodyParser {
2727

2828
switch self {
2929
case .JSON(let readingOptions):
30-
var error: NSError?
31-
if let object: AnyObject = NSJSONSerialization.JSONObjectWithData(data, options: readingOptions, error: &error) {
32-
result = success(object)
33-
} else {
34-
result = failure(error!)
30+
result = try { error in
31+
return NSJSONSerialization.JSONObjectWithData(data, options: readingOptions, error: error)
3532
}
3633

3734
case .URL(let encoding):
38-
var error: NSError?
39-
if let object: AnyObject = URLEncodedSerialization.objectFromData(data, encoding: encoding, error: &error) {
40-
result = success(object)
41-
} else {
42-
result = failure(error!)
35+
result = try { error in
36+
return URLEncodedSerialization.objectFromData(data, encoding: encoding, error: error)
4337
}
4438

4539
case .Custom(let (accept, parseData)):

APIKit/URLEncodedSerialization.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ private func unescape(string: String) -> String {
99
}
1010

1111
public class URLEncodedSerialization {
12-
public class func objectFromData(data: NSData, encoding: NSStringEncoding, inout error: NSError?) -> AnyObject? {
12+
public class func objectFromData(data: NSData, encoding: NSStringEncoding, error: NSErrorPointer) -> AnyObject? {
1313
var dictionary: [String: AnyObject]?
1414

1515
if let string = NSString(data: data, encoding: encoding) as? String {
@@ -26,19 +26,19 @@ public class URLEncodedSerialization {
2626

2727
if dictionary == nil {
2828
let userInfo = [NSLocalizedDescriptionKey: "failed to decode urlencoded string."]
29-
error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo)
29+
error.memory = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo)
3030
}
3131

3232
return dictionary
3333
}
3434

35-
public class func dataFromObject(object: AnyObject, encoding: NSStringEncoding, inout error: NSError?) -> NSData? {
35+
public class func dataFromObject(object: AnyObject, encoding: NSStringEncoding, error: NSErrorPointer) -> NSData? {
3636
let string = stringFromObject(object, encoding: encoding)
3737
let data = string.dataUsingEncoding(encoding, allowLossyConversion: false)
3838

3939
if data == nil {
4040
let userInfo = [NSLocalizedDescriptionKey: "failed to decode urlencoded string."]
41-
error = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo)
41+
error.memory = NSError(domain: APIKitErrorDomain, code: 0, userInfo: userInfo)
4242
}
4343

4444
return data

0 commit comments

Comments
 (0)