OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / MaterialMapper.swift
1 //
2 //  MaterialMapper.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/24.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10 import SwiftyJSON
11
12 final class MaterialMapper: JSONMapper {
13         
14     let apiResponse: APIResponse
15     let configuration: MappingConfiguration<Material>
16     
17     private let keys = [
18         #keyPath(Material.fuel), #keyPath(Material.bull), #keyPath(Material.steel), #keyPath(Material.bauxite),
19         #keyPath(Material.kousokukenzo), #keyPath(Material.kousokushuhuku), #keyPath(Material.kaihatusizai), #keyPath(Material.screw)
20     ]
21     
22     required init(_ apiResponse: APIResponse) {
23         
24         self.apiResponse = apiResponse
25         self.configuration = MappingConfiguration(entity: Material.self,
26                                                   dataKeys: MaterialMapper.dataKeys(apiResponse),
27                                                   editorStore: ServerDataStore.oneTimeEditor())
28     }
29     
30     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
31                 
32         switch apiResponse.api.endpoint {
33             
34         case .material: return ["api_data"]
35             
36         case .port, .createItem, .destroyShip, .charge: return ["api_data", "api_material"]
37             
38         case .remodelSlot: return ["api_data", "api_after_material"]
39             
40         default:
41             
42             Logger.shared.log("Missing API: \(apiResponse.api)")
43             
44             return ["api_data"]
45         }
46     }
47     
48     func commit() {
49         
50         configuration.editorStore.sync(execute: commintInContext)
51     }
52     
53     private func commintInContext() {
54         
55         guard let store = configuration.editorStore as? ServerDataStore,
56             let material = store.material() ?? store.createMaterial() else {
57                 
58                 Logger.shared.log("Can not create Material")
59                 
60                 return
61         }
62         
63         if let _ = data[0].int {
64             
65             let array = data.arrayValue.compactMap { $0.int }
66             register(material, data: array)
67             
68         } else if let _ = data[0].dictionary {
69             
70             register(material, data: data.arrayValue)
71             
72         } else {
73             
74             print("JSON is unknown type")
75             
76         }
77     }
78     
79     private func register(_ material: Material, data: [Int]) {
80         
81         zip(data, keys).forEach {
82             
83             material.setValue($0, forKey: $1)
84         }
85     }
86     
87     private func register(_ material: Material, data: [JSON]) {
88         
89         data.forEach {
90             
91             guard let i = $0["api_id"].int, case 1...keys.count = i else {
92                 
93                 return
94             }
95             guard let newValue = $0["api_value"].int else {
96                 
97                 return
98             }
99             
100             material.setValue(newValue as NSNumber, forKey: keys[i - 1])
101         }
102     }
103 }