@@ -22,18 +22,51 @@ public final class RemoteFeedLoader: FeedLoader {
22
22
client. get ( from: url) { result in
23
23
switch result {
24
24
case let . success( ( data, response) ) :
25
- if response. statusCode == 200 , let root = try ? JSONDecoder ( ) . decode ( Root . self, from: data) {
26
- completion ( . success( root. items) )
27
- } else {
28
- completion ( . failure( Error . invalidData) )
29
- }
25
+ completion ( FeedImagesMapper . map ( data: data, from: response) )
30
26
case . failure:
31
27
completion ( . failure( Error . connectivity) )
32
28
}
33
29
}
34
30
}
35
31
}
36
32
37
- private struct Root : Codable {
38
- let items : [ FeedImage ]
33
+ private final class FeedImagesMapper {
34
+ private struct Root : Decodable {
35
+ let items : [ Item ]
36
+
37
+ var feed : [ FeedImage ] {
38
+ items. map { $0. feedImage }
39
+ }
40
+ }
41
+
42
+ private struct Item : Decodable {
43
+ let id : UUID
44
+ let description : String ?
45
+ let location : String ?
46
+ let url : URL
47
+
48
+ var feedImage : FeedImage {
49
+ . init( id: id, description: description, location: location, url: url)
50
+ }
51
+
52
+ enum CodingKeys : String , CodingKey {
53
+ case id = " image_id "
54
+ case description = " image_desc "
55
+ case location = " image_loc "
56
+ case url = " image_url "
57
+ }
58
+ }
59
+
60
+ private static var goodResponseCode : Int { 200 }
61
+
62
+ static func map( data: Data , from response: HTTPURLResponse ) -> FeedLoader . Result {
63
+ guard
64
+ response. statusCode == goodResponseCode,
65
+ let root = try ? JSONDecoder ( ) . decode ( Root . self, from: data)
66
+ else {
67
+ return . failure( RemoteFeedLoader . Error. invalidData)
68
+ }
69
+
70
+ return . success( root. feed)
71
+ }
39
72
}
0 commit comments