OSDN Git Service

endpointを文字列のまま扱わないようにした
authormasakih <masakih@users.sourceforge.jp>
Sun, 10 Dec 2017 00:57:26 +0000 (09:57 +0900)
committermasakih <masakih@users.sourceforge.jp>
Sun, 10 Dec 2017 00:57:26 +0000 (09:57 +0900)
57 files changed:
KCD.xcodeproj/project.pbxproj
KCD/API.swift [new file with mode: 0644]
KCD/APIResponse.swift
KCD/AirCorpsChangeNameCommand.swift
KCD/AirCorpsSupplyCommand.swift
KCD/BasicMapper.swift
KCD/BattleCommand.swift
KCD/CalculateDamageCommand.swift
KCD/ChangeHenseiCommand.swift
KCD/ClearItemGetComand.swift
KCD/CombinedCommand.swift
KCD/CreateShipCommand.swift
KCD/CreateSlotItemCommand.swift
KCD/DeckMapper.swift
KCD/DestroyItem2Command.swift
KCD/DestroyShipCommand.swift
KCD/DropShipHistoryCommand.swift
KCD/DummyShipCommand.swift
KCD/GetShipCommand.swift
KCD/GuardShelterCommand.swift
KCD/HokyuChargeCommand.swift
KCD/IgnoreCommand.swift
KCD/JSONCommand.swift
KCD/JSONViewCommand.swift
KCD/KaisouLockCommand.swift
KCD/KenzoDockMapper.swift
KCD/MapInfoCommand.swift
KCD/MapStartCommand.swift
KCD/MaterialMapper.swift
KCD/MemberBasicCommand.swift
KCD/MemberDeckCommand.swift
KCD/MemberKDockCommand.swift
KCD/MemberMaterialCommand.swift
KCD/MemberNDockCommand.swift
KCD/MemberRequireInfoCommand.swift
KCD/MemberShip2Command.swift
KCD/MemberShip3Command.swift
KCD/MemberShipCommand.swift
KCD/MemberSlotItemCommand.swift
KCD/NyukyoDockMapper.swift
KCD/NyukyoSpeedChangeCommand.swift
KCD/NyukyoStartCommand.swift
KCD/PortCommand.swift
KCD/PowerUpCommand.swift
KCD/QuestListCommand.swift
KCD/RemodelSlotCommand.swift
KCD/SetActionCommand.swift
KCD/SetPlaneCommand.swift
KCD/ShipDeckCommand.swift
KCD/ShipMapper.swift
KCD/SlotDepriveCommand.swift
KCD/SlotItemMapper.swift
KCD/SlotResetCommand.swift
KCD/Start2Command.swift
KCDTests/CombinedBattleTest.swift
KCDTests/GuardEscapeTest.swift
KCDTests/NormalBattleTest.swift

index d428379..0ab907f 100644 (file)
                F47215AA1E1F96B60083D3BC /* ResourceHistoryDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47215A91E1F96B60083D3BC /* ResourceHistoryDataStore.swift */; };
                F47215AC1E1FA2460083D3BC /* TemporaryDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47215AB1E1FA2460083D3BC /* TemporaryDataStore.swift */; };
                F47215B01E1FEACC0083D3BC /* ServerDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47215AF1E1FEACC0083D3BC /* ServerDataStore.swift */; };
+               F4760CE81FDAC5F100702C3E /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4760CE71FDAC5F100702C3E /* API.swift */; };
                F47B06DD1E97ECD4006711D9 /* WindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47B06DC1E97ECD4006711D9 /* WindowManager.swift */; };
                F47C3E981E5DB29300D97449 /* JSONMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47C3E971E5DB29300D97449 /* JSONMapper.swift */; };
                F47C3E9A1E5DC90000D97449 /* MasterSTypeMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47C3E991E5DC90000D97449 /* MasterSTypeMapper.swift */; };
                F47215A91E1F96B60083D3BC /* ResourceHistoryDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResourceHistoryDataStore.swift; sourceTree = "<group>"; };
                F47215AB1E1FA2460083D3BC /* TemporaryDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TemporaryDataStore.swift; sourceTree = "<group>"; };
                F47215AF1E1FEACC0083D3BC /* ServerDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerDataStore.swift; sourceTree = "<group>"; };
+               F4760CE71FDAC5F100702C3E /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = "<group>"; };
                F47B06DC1E97ECD4006711D9 /* WindowManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowManager.swift; sourceTree = "<group>"; };
                F47C3E971E5DB29300D97449 /* JSONMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONMapper.swift; sourceTree = "<group>"; };
                F47C3E991E5DC90000D97449 /* MasterSTypeMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterSTypeMapper.swift; sourceTree = "<group>"; };
                                F4FC3E8F1E437E1F00E41228 /* JSONReciever.swift */,
                                F4CF25A91E338ED000C02A66 /* JSONTracker.swift */,
                                F4CF25A71E325ABA00C02A66 /* APIResponse.swift */,
+                               F4760CE71FDAC5F100702C3E /* API.swift */,
                                F4CF25BF1E36428400C02A66 /* MissionStatus.swift */,
                                F4CF25BD1E361F4600C02A66 /* NyukyoDockStatus.swift */,
                                F4CF25BB1E34F67400C02A66 /* KenzoDockStatus.swift */,
                                F47C3EAE1E5F26E900D97449 /* DeckMapper.swift in Sources */,
                                F4048AA11E1951BB008ACFD6 /* SuppliesCell.swift in Sources */,
                                F490977D1E19DF390085A45D /* SlotItemFrameView.swift in Sources */,
+                               F4760CE81FDAC5F100702C3E /* API.swift in Sources */,
                                F4E471291E46ECF1009B5AF4 /* CoreDataCore.swift in Sources */,
                                F4AF56811F7BF0CF004F4F4E /* IntConvertable.swift in Sources */,
                                F47C3EA01E5DE08F00D97449 /* MasterMapInfoMapper.swift in Sources */,
diff --git a/KCD/API.swift b/KCD/API.swift
new file mode 100644 (file)
index 0000000..2825a3c
--- /dev/null
@@ -0,0 +1,221 @@
+//
+//  API.swift
+//  KCD
+//
+//  Created by Hori,Masaki on 2017/12/08.
+//  Copyright © 2017年 Hori,Masaki. All rights reserved.
+//
+
+
+import Foundation
+
+enum Endpoint: String {
+    
+    case start2 = "/kcsapi/api_start2"
+    case requireInfo = "/kcsapi/api_get_member/require_info"
+    case mapInfo = "/kcsapi/api_get_member/mapinfo"
+    
+    // Port
+    case port = "/kcsapi/api_port/port"
+    
+    // Dock
+    case ndock = "/kcsapi/api_get_member/ndock"
+    case kdock = "/kcsapi/api_get_member/kdock"
+    
+    // Deck
+    case deck = "/kcsapi/api_get_member/deck"
+    case deckPort = "/kcsapi/api_get_member/deck_port"
+    case presetSelect = "/kcsapi/api_req_hensei/preset_select"
+    
+    // Supplies
+    case material = "/kcsapi/api_get_member/material"
+    case basic = "/kcsapi/api_get_member/basic"
+    
+    // Ship
+    case ship = "/kcsapi/api_get_member/ship"
+    case ship2 = "/kcsapi/api_get_member/ship2"
+    case ship3 = "/kcsapi/api_get_member/ship3"
+    case shipDeck = "/kcsapi/api_get_member/ship_deck"
+    
+    case createShip = "/kcsapi/api_req_kousyou/createship"
+    case getShip = "/kcsapi/api_req_kousyou/getship"
+    case destroyShip = "/kcsapi/api_req_kousyou/destroyship"
+    
+    case powerup = "/kcsapi/api_req_kaisou/powerup"
+    
+    case shipLock = "/kcsapi/api_req_kaisou/lock"
+    
+    // SlotItem
+    case slotItem = "/kcsapi/api_get_member/slot_item"
+    
+    case exchangeIndex = "/kcsapi/api_req_kaisou/slot_exchange_index"
+    case slotDeprive = "/kcsapi/api_req_kaisou/slot_deprive"
+    
+    case createItem = "/kcsapi/api_req_kousyou/createitem"
+    case destroyItem2 = "/kcsapi/api_req_kousyou/destroyitem2"
+    
+    case remodelSlot = "/kcsapi/api_req_kousyou/remodel_slot"
+    
+    // Hensei
+    case henseiCombined = "/kcsapi/api_req_hensei/combined"
+    case change = "/kcsapi/api_req_hensei/change"
+    
+    // Nyukyo
+    case startNyukyo = "/kcsapi/api_req_nyukyo/start"
+    case speedChange = "/kcsapi/api_req_nyukyo/speedchange"
+    
+    // Charge
+    case charge = "/kcsapi/api_req_hokyu/charge"
+    
+    // Airbase
+    case setPlane = "/kcsapi/api_req_air_corps/set_plane"
+    case setAction = "/kcsapi/api_req_air_corps/set_action"
+    case airCorpsSupply = "/kcsapi/api_req_air_corps/supply"
+    case airCorpsRename = "/kcsapi/api_req_air_corps/change_name"
+    
+    // Battle
+    case battle = "/kcsapi/api_req_sortie/battle"
+    
+    case combinedBattle = "/kcsapi/api_req_combined_battle/battle"
+    case combinedAirBattle = "/kcsapi/api_req_combined_battle/airbattle"
+    case combinedBattleWater = "/kcsapi/api_req_combined_battle/battle_water"
+    case combinedEcBattle = "/kcsapi/api_req_combined_battle/ec_battle"
+    case combinedEachBattle = "/kcsapi/api_req_combined_battle/each_battle"
+    case combinedEachBattleWater = "/kcsapi/api_req_combined_battle/each_battle_water"
+    
+    case combinedEachNightToDay = "/kcsapi/api_req_combined_battle/ec_night_to_day"
+    
+    case airBattle = "/kcsapi/api_req_sortie/airbattle"
+    case ldAirBattle = "/kcsapi/api_req_sortie/ld_airbattle"
+    case combinedLdAirBattle = "/kcsapi/api_req_combined_battle/ld_airbattle"
+    
+    case midnightBattle = "/kcsapi/api_req_battle_midnight/battle"
+    case midnightSpMidnight = "/kcsapi/api_req_battle_midnight/sp_midnight"
+    case combinedEcMidnightBattle = "/kcsapi/api_req_combined_battle/ec_midnight_battle"
+    case combinedMidnightBattle = "/kcsapi/api_req_combined_battle/midnight_battle"
+    case combinedSpMidnight = "/kcsapi/api_req_combined_battle/sp_midnight"
+    
+    case battleResult = "/kcsapi/api_req_sortie/battleresult"
+    case combinedBattleResult = "/kcsapi/api_req_combined_battle/battleresult"
+    
+    // GuardEscape
+    case goback = "/kcsapi/api_req_combined_battle/goback_port"
+    case gobakAlone = "/kcsapi/api_req_sortie/goback_port"
+    
+    // Map
+    case start = "/kcsapi/api_req_map/start"
+    case next = "/kcsapi/api_req_map/next"
+    
+    //Quest
+    case questList = "/kcsapi/api_get_member/questlist"
+    case clearItemGet = "/kcsapi/api_req_quest/clearitemget"
+    
+    // Unknown
+    case unknown = "UNKNOWN_API_STRING"
+}
+
+enum APIType {
+    
+    case port
+    
+    case deck
+    
+    case battle
+    
+    case battleResult
+    
+    case guardEscape
+    
+    case map
+    
+    case other
+}
+
+private func apiType(of endpoint: Endpoint) -> APIType {
+    
+    switch endpoint {
+        
+    case .port:
+        return .port
+        
+    case .deck, .deckPort, .presetSelect:
+        return .deck
+        
+    case .battle,
+         .combinedBattle, .combinedAirBattle, .combinedBattleWater,
+         .combinedEcBattle, .combinedEachBattle, .combinedEachBattleWater,
+         .combinedEachNightToDay,
+         .airBattle, .ldAirBattle, .combinedLdAirBattle,
+         .midnightBattle, .midnightSpMidnight,
+         .combinedMidnightBattle, .combinedEcMidnightBattle, .combinedSpMidnight:
+        return .battle
+        
+    case .battleResult, .combinedBattleResult:
+        return .battleResult
+        
+    case .goback, .gobakAlone:
+        return .guardEscape
+        
+    case .start, .next:
+        return .map
+        
+    default:
+        return .other
+    }
+}
+
+struct API {
+    
+    let endpoint: Endpoint
+    
+    var type: APIType {
+        
+        return apiType(of: endpoint)
+    }
+    
+    private var endpointString: String {
+        
+        switch endpoint {
+        case .unknown: return rawEndpointString ?? "Not Recorded"
+        default: return endpoint.rawValue
+        }
+    }
+    
+    private var rawEndpointString: String?
+    
+    init(endpointPath rawValue: String) {
+        
+        endpoint = Endpoint(rawValue: rawValue) ?? .unknown
+        
+        if endpoint == .unknown {
+            
+            rawEndpointString = rawValue
+        }
+    }
+    
+    func includs(in rawValues: [String]) -> Bool {
+        
+        return rawValues.contains(endpointString)
+    }
+    
+    func isRanking() -> Bool {
+        
+        return endpointString.hasPrefix("/kcsapi/api_req_ranking/")
+    }
+}
+
+extension API: CustomStringConvertible {
+    
+    var description: String {
+        
+        return "API: \(endpointString)"
+    }
+}
+
+extension API: CustomDebugStringConvertible {
+    
+    var debugDescription: String {
+        
+        return endpointString
+    }
+}
index a564383..26ae629 100644 (file)
@@ -138,7 +138,7 @@ extension Parameter: Equatable {
 
 struct APIResponse {
     
-    let api: String
+    let api: API
     let parameter: Parameter
     let json: JSON
     let date: Date
@@ -149,7 +149,7 @@ struct APIResponse {
         return false
     }
     
-    init(api: String, parameter: Parameter, json: JSON) {
+    init(api: API, parameter: Parameter, json: JSON) {
         
         self.api = api
         self.parameter = parameter
@@ -183,6 +183,6 @@ struct APIResponse {
             return nil
         }
         
-        self.api = api
+        self.api = API(endpointPath: api)
     }
 }
index 64b1950..9d2ff27 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class AirCorpsChangeNameCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_air_corps/change_name" { return true }
-        
-        return false
+        return api.endpoint == .airCorpsRename
     }
     
     override func execute() {
index a1188b1..072d2dc 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class AirCorpsSupplyCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_air_corps/supply" { return true }
-        
-        return false
+        return api.endpoint == .airCorpsSupply
     }
     
     override func execute() {
index 9ca334b..0cb8f4d 100644 (file)
@@ -21,20 +21,15 @@ final class BasicMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    private enum BasicAPI: String {
-        
-        case getMemberBasic = "/kcsapi/api_get_member/basic"
-        case port = "/kcsapi/api_port/port"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let basicApi = BasicAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch basicApi {
+        switch apiResponse.api.endpoint {
+            
         case .port: return ["api_data", "api_basic"]
             
-        case .getMemberBasic: return ["api_data"]
+        case .basic: return ["api_data"]
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
     
index 41a90b4..e9c1958 100644 (file)
@@ -8,47 +8,19 @@
 
 import Cocoa
 
-enum BattleAPI: String {
-    
-    case battle = "/kcsapi/api_req_sortie/battle"
-    
-    case combinedBattle = "/kcsapi/api_req_combined_battle/battle"
-    case combinedAirBattle = "/kcsapi/api_req_combined_battle/airbattle"
-    case combinedBattleWater = "/kcsapi/api_req_combined_battle/battle_water"
-    case combinedEcBattle = "/kcsapi/api_req_combined_battle/ec_battle"
-    case combinedEachBattle = "/kcsapi/api_req_combined_battle/each_battle"
-    case combinedEachBattleWater = "/kcsapi/api_req_combined_battle/each_battle_water"
-    
-    case combinedEachNightToDay = "/kcsapi/api_req_combined_battle/ec_night_to_day"
-    
-    case airBattle = "/kcsapi/api_req_sortie/airbattle"
-    case ldAirBattle = "/kcsapi/api_req_sortie/ld_airbattle"
-    case combinedLdAirBattle = "/kcsapi/api_req_combined_battle/ld_airbattle"
-    
-    case midnightBattle = "/kcsapi/api_req_battle_midnight/battle"
-    case midnightSpMidnight = "/kcsapi/api_req_battle_midnight/sp_midnight"
-    case combinedEcMidnightBattle = "/kcsapi/api_req_combined_battle/ec_midnight_battle"
-    case combinedMidnightBattle = "/kcsapi/api_req_combined_battle/midnight_battle"
-    case combinedSpMidnight = "/kcsapi/api_req_combined_battle/sp_midnight"
-    
-    case battleResult = "/kcsapi/api_req_sortie/battleresult"
-    case combinedBattleResult = "/kcsapi/api_req_combined_battle/battleresult"
-}
-
 final class BattleCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        return BattleAPI(rawValue: api) != nil
+        return api.type == .battle || api.type == .battleResult
     }
     
     override func execute() {
         
         CalculateDamageCommand(apiResponse: apiResponse).execute()
         
-        guard let battleApi = BattleAPI(rawValue: apiResponse.api) else { return }
-        
-        switch battleApi {
+        switch apiResponse.api.endpoint {
+            
         case .battleResult, .combinedBattleResult:
             DropShipHistoryCommand(apiResponse: apiResponse).execute()
             DummyShipCommand(apiResponse: apiResponse).execute()
index 1cd782a..474ef8d 100644 (file)
@@ -29,9 +29,8 @@ final class CalculateDamageCommand: JSONCommand {
     
     override func execute() {
         
-        guard let battleApi = BattleAPI(rawValue: api) else { return }
-        
-        switch battleApi {
+        switch api.endpoint {
+            
         case .battle, .airBattle, .ldAirBattle:
             normalBattle(battleType: .normal)
             
@@ -65,6 +64,8 @@ final class CalculateDamageCommand: JSONCommand {
         case .battleResult, .combinedBattleResult:
             applyDamage()
             resetDamage()
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)")
         }
     }
     
index 13d0da7..9381b52 100644 (file)
@@ -57,11 +57,9 @@ final class ChangeHenseiCommand: JSONCommand {
     
     static let userInfoKey = "HenseiDidChangeUserInfoKey"
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_hensei/change" { return true }
-        
-        return false
+        return api.endpoint == .change
     }
     
     // api_ship_id の値
index 7d96c9b..720398e 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class ClearItemGetComand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_quest/clearitemget" { return true }
-        
-        return false
+        return api.endpoint == .clearItemGet
     }
     
     override func execute() {
index ce560db..2acb14a 100644 (file)
@@ -25,16 +25,14 @@ final class CombinedCommand: JSONCommand {
     
     static let userInfoKey = "com.masakih.KCD.Notification.CombinedDidCange.CombinedType"
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_hensei/combined" { return true }
-        
-        return false
+        return api.endpoint == .henseiCombined
     }
     
     override func execute() {
         
-        if api == "/kcsapi/api_port/port" {
+        if api.endpoint == .port {
             
             if let t = data["api_combined_flag"].int {
                 
index 21d9e23..10fcd16 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class CreateShipCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/createship" { return true }
-        
-        return false
+        return api.endpoint == .createShip
     }
     
     override func execute() {
index 2fae8e2..20a73fe 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class CreateSlotItemCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/createitem" { return true }
-        
-        return false
+        return api.endpoint == .createItem
     }
     
     override func execute() {
index cc1524e..511ab74 100644 (file)
@@ -21,35 +21,21 @@ final class DeckMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    
-    private enum DeckAPI: String {
-        
-        case getMemberDeck = "/kcsapi/api_get_member/deck"
-        case port = "/kcsapi/api_port/port"
-        case getMemberShip2 = "/kcsapi/api_get_member/ship2"
-        case getMemberShip3 = "/kcsapi/api_get_member/ship3"
-        case getMemberShipDeck = "/kcsapi/api_get_member/ship_deck"
-        case getMemberDeckPort = "/kcsapi/api_get_member/deck_port"
-        case henseiPresetSelect = "/kcsapi/api_req_hensei/preset_select"
-        case kaisouPowerUp = "/kcsapi/api_req_kaisou/powerup"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let deckApi = DeckAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch deckApi {
+        switch apiResponse.api.endpoint {
+            
         case .port: return ["api_data", "api_deck_port"]
             
-        case .getMemberShip2: return ["api_data_deck"]
+        case .ship3, .shipDeck: return ["api_data", "api_deck_data"]
             
-        case .getMemberShip3: return ["api_data", "api_deck_data"]
+        case .ship2: return ["api_data_deck"]
             
-        case .getMemberShipDeck: return ["api_data", "api_deck_data"]
+        case .powerup: return ["api_data", "api_deck"]
             
-        case .kaisouPowerUp: return ["api_data", "api_deck"]
+        case .deck, .deckPort, .presetSelect: return ["api_data"]
             
-        case .getMemberDeck, .getMemberDeckPort, .henseiPresetSelect: return ["api_data"]
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
 }
index d31b37a..8ae214b 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class DestroyItem2Command: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/destroyitem2" { return true }
-        
-        return false
+        return api.endpoint == .destroyItem2
     }
     
     override func execute() {
index 8d5d684..d107f64 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class DestroyShipCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/destroyship" { return true }
-        
-        return false
+        return api.endpoint == .destroyShip
     }
     
     override func execute() {
index 2bc9062..57945b7 100644 (file)
@@ -12,13 +12,12 @@ final class DropShipHistoryCommand: JSONCommand {
     
     override func execute() {
         
-        if api == "/kcsapi/api_port/port" || api == "/kcsapi/api_get_member/ship_deck" {
+        if api.endpoint == .port || api.endpoint == .shipDeck {
             
             storeToVisible()
-            
         }
         
-        if !api.hasSuffix("battleresult") { return }
+        if api.type != .battleResult { return }
         
         guard let shipName = data["api_get_ship"]["api_ship_name"].string else { return }
         guard let winRank = data["api_win_rank"].string else { return }
index 2621563..e1f5922 100644 (file)
@@ -17,9 +17,16 @@ final class DummyShipCommand: JSONCommand {
     
     override func execute() {
         
-        if api == "/kcsapi/api_req_sortie/battleresult" { checkGetShip() }
-        if api == "/kcsapi/api_get_member/ship_deck" { enterDummy() }
-        if api == "/kcsapi/api_port/port" { removeDummy() }
+        switch api.endpoint {
+            
+        case .battleResult, .combinedBattleResult: checkGetShip()
+        
+        case .shipDeck: enterDummy()
+        
+        case .port: removeDummy()
+        
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)")
+        }
     }
     
     private func checkGetShip() {
index 89722b6..ab49def 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class GetShipCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/getship" { return true }
-        
-        return false
+        return api.endpoint == .getShip
     }
     
     override func execute() {
index e7faabb..fdb595e 100644 (file)
@@ -8,13 +8,6 @@
 
 import Cocoa
 
-
-enum GuardEscapeAPI: String {
-    
-    case goback = "/kcsapi/api_req_combined_battle/goback_port"
-    case gobakAlone = "/kcsapi/api_req_sortie/goback_port"
-}
-
 extension Notification.Name {
     
     static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
@@ -22,34 +15,28 @@ extension Notification.Name {
 
 final class GuardShelterCommand: JSONCommand {
         
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        return GuardEscapeAPI(rawValue: api) != nil
+        return api.type == .guardEscape
     }
     
     override func execute() {
         
-        if let b = BattleAPI(rawValue: api) {
+        switch api.type {
             
-            switch b {
-            case .battleResult, .combinedBattleResult:
-                registerReserve()
-                
-            default:
-                break
-            }
-        }
-        if let m = MapAPI(rawValue: api), m == .next {
+        case .battleResult:
+            registerReserve()
             
+        case .map:
             removeInvalidEntry()
-        }
-        if let _ = GuardEscapeAPI(rawValue: api) {
             
+        case .guardEscape:
             ensureGuardShelter()
-        }
-        if let _ = PortAPI(rawValue: api) {
             
+        case .port:
             removeAllEntry()
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)")
         }
     }
     
index 66b2101..053ecf9 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class HokyuChargeCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_hokyu/charge" { return true }
-        
-        return false
+        return api.endpoint == .charge
     }
     
     override func execute() {
index 18aa076..f5130c1 100644 (file)
@@ -21,10 +21,10 @@ final class IgnoreCommand: JSONCommand {
         return array
     }()
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if ignores.contains(api) { return true }
-        if api.hasPrefix("/kcsapi/api_req_ranking/") { return true }
+        if api.includs(in: ignores) { return true }
+        if api.isRanking() { return true }
         
         return false
     }
index 65145ab..4a28df5 100644 (file)
@@ -11,7 +11,7 @@ import SwiftyJSON
 
 class JSONCommand {
     
-    class func canExecuteAPI(_ api: String) -> Bool { return false }
+    class func canExecuteAPI(_ api: API) -> Bool { return false }
     
     let apiResponse: APIResponse
     
@@ -20,7 +20,7 @@ class JSONCommand {
         self.apiResponse = apiResponse
     }
     
-    var api: String { return apiResponse.api }
+    var api: API { return apiResponse.api }
     var parameter: Parameter { return apiResponse.parameter }
     var json: JSON { return apiResponse.json }
     
index 9a9cf02..99ba6f1 100644 (file)
@@ -53,7 +53,7 @@ final class JSONViewCommand: JSONCommand {
         DispatchQueue.main.async {
             
             let commands: [String: Any] = [
-                "api": self.api,
+                "api": self.api.debugDescription,
                 "argument": self.parameterList,
                 "json": self.jsonTree ?? [],
                 "recieveDate": self.recieveDate ?? Date(),
index a6576e5..79ed2f7 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class KaisouLockCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kaisou/lock" { return true }
-        
-        return false
+        return api.endpoint == .shipLock
     }
     
     override func execute() {
index 4d10008..f790672 100644 (file)
@@ -21,24 +21,15 @@ final class KenzoDockMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    
-    private enum KenzoDockAPI: String {
-        
-        case getMemberKDock = "/kcsapi/api_get_member/kdock"
-        case kousyouGetShip = "/kcsapi/api_req_kousyou/getship"
-        case getMemberRequireInfo = "/kcsapi/api_get_member/require_info"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let kenzoDockApi = KenzoDockAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch kenzoDockApi {
-        case .kousyouGetShip: return ["api_data", "api_kdock"]
+        switch apiResponse.api.endpoint {
             
-        case .getMemberRequireInfo: return ["api_data", "api_kdock"]
+        case .getShip, .requireInfo: return ["api_data", "api_kdock"]
+                        
+        case .kdock: return ["api_data"]
             
-        case .getMemberKDock: return ["api_data"]
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
 }
index e67a7dd..1e2ccf3 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MapInfoCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/mapinfo" { return true }
-        
-        return false
+        return api.endpoint == .mapInfo
     }
     
     override func execute() {
index dac7f03..ab8b6f8 100644 (file)
@@ -8,32 +8,25 @@
 
 import Cocoa
 
-enum MapAPI: String {
-    
-    case start = "/kcsapi/api_req_map/start"
-    case next = "/kcsapi/api_req_map/next"
-}
-
 final class MapStartCommand: JSONCommand {
     
     private let store = TemporaryDataStore.oneTimeEditor()
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        return MapAPI(rawValue: api) != nil
+        return api.type == .map
     }
     
     override func execute() {
         
-        MapAPI(rawValue: api).map {
+        switch api.endpoint {
+        case .start: startBattle()
             
-            switch $0 {
-            case .start: startBattle()
-                
-            case .next:
-                nextCell()
-                updateBattleCell()
-            }
+        case .next:
+            nextCell()
+            updateBattleCell()
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)")
         }
         
         GuardShelterCommand(apiResponse: apiResponse).execute()
index 6906a15..f0e9d2a 100644 (file)
@@ -27,30 +27,17 @@ final class MaterialMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    
-    private enum MaterialAPI: String {
-        
-        case port = "/kcsapi/api_port/port"
-        case kousyouCreateItem = "/kcsapi/api_req_kousyou/createitem"
-        case kousyouDestoroyShip = "/kcsapi/api_req_kousyou/destroyship"
-        case kousyouRemodelSlot = "/kcsapi/api_req_kousyou/remodel_slot"
-        case hokyuCharge = "/kcsapi/api_req_hokyu/charge"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
-        
-        guard let materialApi = MaterialAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch materialApi {
-        case .port: return ["api_data", "api_material"]
+                
+        switch apiResponse.api.endpoint {
             
-        case .kousyouCreateItem: return ["api_data", "api_material"]
+        case .material: return ["api_data"]
             
-        case .kousyouDestoroyShip: return ["api_data", "api_material"]
+        case .port, .createItem, .destroyShip, .charge: return ["api_data", "api_material"]
             
-        case .kousyouRemodelSlot: return ["api_data", "api_after_material"]
+        case .remodelSlot: return ["api_data", "api_after_material"]
             
-        case .hokyuCharge: return ["api_data", "api_material"]
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
     
index 603c6f8..f5b82c3 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberBasicCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/basic" { return true }
-        
-        return false
+        return api.endpoint == .basic
     }
     
     override func execute() {
index 9072dc2..3898639 100644 (file)
@@ -10,13 +10,9 @@ import Cocoa
 
 final class MemberDeckCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/deck" { return true }
-        if api == "/kcsapi/api_get_member/deck_port" { return true }
-        if api == "/kcsapi/api_req_hensei/preset_select" { return true }
-        
-        return false
+        return api.type == .deck
     }
     
     override func execute() {
index 3f6327b..3acef83 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberKDockCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/kdock" { return true }
-        
-        return false
+        return api.endpoint == .kdock
     }
     
     override func execute() {
index c10edea..0aaeb3d 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberMaterialCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/material" { return true }
-        
-        return false
+        return api.endpoint == .material
     }
     
     override func execute() {
index de27b9a..9568e5d 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberNDockCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/ndock" { return true }
-        
-        return false
+        return api.endpoint == .ndock
     }
     
     override func execute() {
index 122765e..6423edc 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberRequireInfoCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/require_info" { return true }
-        
-        return false
+        return api.endpoint == .requireInfo
     }
     
     override func execute() {
index 3218d0b..58703fe 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberShip2Command: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/ship2" { return true }
-        
-        return false
+        return api.endpoint == .ship2
     }
     
     override func execute() {
index 4f876b9..29e6546 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberShip3Command: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/ship3" { return true }
-        
-        return false
+        return api.endpoint == .ship3
     }
     
     override func execute() {
index 896d702..c95166f 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberShipCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/ship" { return true }
-        
-        return false
+        return api.endpoint == .ship
     }
     
     override func execute() {
index 043c9c6..fb955b4 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class MemberSlotItemCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/slot_item" { return true }
-        
-        return false
+        return api.endpoint == .slotItem
     }
     
     override func execute() {
index 7782a0a..b5032d6 100644 (file)
@@ -21,21 +21,15 @@ final class NyukyoDockMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    
-    private enum DeckAPI: String {
-        
-        case getMemberNDock = "/kcsapi/api_get_member/ndock"
-        case port = "/kcsapi/api_port/port"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let deckApi = DeckAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch deckApi {
+        switch apiResponse.api.endpoint {
+            
         case .port: return ["api_data", "api_ndock"]
             
-        case .getMemberNDock: return ["api_data"]
+        case .ndock: return ["api_data"]
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
 }
index eb61a52..cae2d39 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class NyukyoSpeedChangeCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_nyukyo/speedchange" { return true }
-        
-        return false
+        return api.endpoint == .speedChange
     }
     
     override func execute() {
index 2c552ec..877ed24 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class NyukyoStartCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_nyukyo/start" { return true }
-        
-        return false
+        return api.endpoint == .startNyukyo
     }
     
     override func execute() {
index f94a288..1e08360 100644 (file)
@@ -8,16 +8,11 @@
 
 import Cocoa
 
-enum PortAPI: String {
-    
-    case port = "/kcsapi/api_port/port"
-}
-
 final class PortCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        return PortAPI(rawValue: api) != nil ? true : false
+        return api.type == .port
     }
     
     override func execute() {
index fdb4cf4..9e50870 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class PowerUpCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kaisou/powerup" { return true }
-        
-        return false
+        return api.endpoint == .powerup
     }
     
     override func execute() {
index 59d487e..355cc31 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class QuestListCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/questlist" { return true }
-        
-        return false
+        return api.endpoint == .questList
     }
     
     override func execute() {
index d4cdf7b..a00b546 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class RemodelSlotCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kousyou/remodel_slot" { return true }
-        
-        return false
+        return api.endpoint == .remodelSlot
     }
     
     override func execute() {
index 6fb7aab..7e874ae 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class SetActionCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_air_corps/set_action" { return true }
-        
-        return false
+        return api.endpoint == .setAction
     }
     
     override func execute() {
index 6ded100..29fa758 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class SetPlaneCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_air_corps/set_plane" { return true }
-        
-        return false
+        return api.endpoint == .setPlane
     }
     
     override func execute() {
index 6610396..75fe8dd 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class ShipDeckCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_get_member/ship_deck" { return true }
-        
-        return false
+        return api.endpoint == .shipDeck
     }
     
     override func execute() {
@@ -22,7 +20,6 @@ final class ShipDeckCommand: JSONCommand {
         ShipMapper(apiResponse).commit()
         DeckMapper(apiResponse).commit()
         DummyShipCommand(apiResponse: apiResponse).execute()
-        GuardShelterCommand(apiResponse: apiResponse).execute()
         DropShipHistoryCommand(apiResponse: apiResponse).execute()
     }
 }
index 3eb83f5..3a655d3 100644 (file)
@@ -43,7 +43,7 @@ final class ShipMapper: JSONMapper {
              "api_fuel_max", "api_bull_max"])
         
         // kaisouSlotDepriveでは同時に2種類のデータが入る
-        if let api = ShipAPI(rawValue: apiResponse.api), api == .kaisouSlotDeprive {
+        if apiResponse.api.endpoint == .slotDeprive {
             
             let conf = self.configuration.change(dataKeys: ["api_data", "api_ship_data", "api_unset_ship"])
             ShipMapper(apiResponse, configuration: conf).commit()
@@ -56,36 +56,19 @@ final class ShipMapper: JSONMapper {
         self.configuration = configuration
     }
     
-    
-    private enum ShipAPI: String {
-        
-        case getMemberShip = "/kcsapi/api_get_member/ship"
-        case port = "/kcsapi/api_port/port"
-        case getMemberShip3 = "/kcsapi/api_get_member/ship3"
-        case kousyouGetShip = "/kcsapi/api_req_kousyou/getship"
-        case getMemberShipDeck = "/kcsapi/api_get_member/ship_deck"
-        case kaisouPowerUp = "/kcsapi/api_req_kaisou/powerup"
-        case kaisouSlotDeprive = "/kcsapi/api_req_kaisou/slot_deprive"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let shipApi = ShipAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch shipApi {
-        case .port: return ["api_data", "api_ship"]
-            
-        case .getMemberShip3: return ["api_data", "api_ship_data"]
+        switch apiResponse.api.endpoint {
             
-        case .kousyouGetShip: return ["api_data", "api_ship"]
+        case .port, .getShip, .powerup: return ["api_data", "api_ship"]
             
-        case .getMemberShipDeck: return ["api_data", "api_ship_data"]
+        case .ship3, .shipDeck: return ["api_data", "api_ship_data"]
             
-        case .kaisouPowerUp: return ["api_data", "api_ship"]
+        case .slotDeprive: return ["api_data", "api_ship_data", "api_set_ship"]
             
-        case .kaisouSlotDeprive: return ["api_data", "api_ship_data", "api_set_ship"]
+        case .ship: return ["api_data"]
             
-        case .getMemberShip: return ["api_data"]
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
     
@@ -100,11 +83,9 @@ final class ShipMapper: JSONMapper {
     }()
     private var isDeleteNotExist: Bool {
         
-        guard let shipApi = ShipAPI(rawValue: apiResponse.api) else { return true }
-        
-        switch shipApi {
-        case .getMemberShip3, .kousyouGetShip, .getMemberShipDeck,
-             .kaisouPowerUp, .kaisouSlotDeprive:
+        switch apiResponse.api.endpoint {
+        case .ship3, .getShip, .shipDeck,
+             .powerup, .slotDeprive:
             return false
             
         default:
index df1de61..ec60d45 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class SlotDepriveCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kaisou/slot_deprive" { return true }
-        
-        return false
+        return api.endpoint == .slotDeprive
     }
     
     override func execute() {
index 07d79f2..5739cae 100644 (file)
@@ -22,24 +22,17 @@ final class SlotItemMapper: JSONMapper {
                                                   editorStore: ServerDataStore.oneTimeEditor())
     }
     
-    
-    private enum SlotItemAPI: String {
-        
-        case getMemberSlotItem = "/kcsapi/api_get_member/slot_item"
-        case kousyouGetShip = "/kcsapi/api_req_kousyou/getship"
-        case getMemberRequireInfo = "/kcsapi/api_get_member/require_info"
-    }
-    
     private class func dataKeys(_ apiResponse: APIResponse) -> [String] {
         
-        guard let slotItemApi = SlotItemAPI(rawValue: apiResponse.api) else { return ["api_data"] }
-        
-        switch slotItemApi {
-        case .kousyouGetShip: return ["api_data", "api_slotitem"]
+        switch apiResponse.api.endpoint {
+            
+        case .getShip: return ["api_data", "api_slotitem"]
             
-        case .getMemberRequireInfo: return ["api_data", "api_slot_item"]
+        case .requireInfo: return ["api_data", "api_slot_item"]
             
-        case .getMemberSlotItem: return ["api_data"]
+        case .slotItem: return ["api_data"]
+            
+        default: return Logger.shared.log("Missing API: \(apiResponse.api)", value: ["api_data"])
         }
     }
     
@@ -80,11 +73,9 @@ final class SlotItemMapper: JSONMapper {
     func finishOperating() {
         
         // getshipの時は取得した艦娘の装備のみのデータのため無視
-        if let slotItemApi = SlotItemAPI(rawValue: apiResponse.api),
-            slotItemApi == .kousyouGetShip {
+        if apiResponse.api.endpoint == .getShip {
             
             return
-            
         }
         
         guard let store = configuration.editorStore as? ServerDataStore else { return }
index 90c0174..a4fbc59 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class SlotResetCommand: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_req_kaisou/slot_exchange_index" { return true }
-        
-        return false
+        return api.endpoint == .exchangeIndex
     }
     
     override func execute() {
index 4138ee3..550ed5a 100644 (file)
@@ -10,11 +10,9 @@ import Cocoa
 
 final class Start2Command: JSONCommand {
     
-    override class func canExecuteAPI(_ api: String) -> Bool {
+    override class func canExecuteAPI(_ api: API) -> Bool {
         
-        if api == "/kcsapi/api_start2" { return true }
-        
-        return false
+        return api.endpoint == .start2
     }
     
     override func execute() {
index 48b529a..ad920f2 100644 (file)
@@ -75,7 +75,7 @@ class CombinedBattleTest: XCTestCase {
             ]
             let param = Parameter(paramValue)
             
-            let api = APIResponse(api: MapAPI.start.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(rawValue: RawAPI.start.rawValue), parameter: param, json: json)
             XCTAssertEqual(api.json, json)
             XCTAssertEqual(api.parameter, param)
             
@@ -214,7 +214,7 @@ class CombinedBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.combinedBattle.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(rawValue: RawAPI.combinedBattle.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -252,7 +252,7 @@ class CombinedBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.combinedMidnightBattle.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(rawValue: RawAPI.combinedMidnightBattle.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -265,7 +265,7 @@ class CombinedBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.combinedBattleResult.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(rawValue: RawAPI.combinedBattleResult.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
index 54c70ea..8cdfaa8 100644 (file)
@@ -94,10 +94,10 @@ class GuardEscapeTest: XCTestCase {
             
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let resultApi = APIResponse(api: BattleAPI.battleResult.rawValue, parameter: param, json: json)
+            let resultApi = APIResponse(api: API(rawValue: RawAPI.battleResult.rawValue), parameter: param, json: json)
             GuardShelterCommand(apiResponse: resultApi).execute()
             
-            let goBackApi = APIResponse(api: GuardEscapeAPI.goback.rawValue, parameter: param, json: json)
+            let goBackApi = APIResponse(api: API(rawValue: RawAPI.goback.rawValue), parameter: param, json: json)
             GuardShelterCommand(apiResponse: goBackApi).execute()
         }
         
@@ -167,10 +167,10 @@ class GuardEscapeTest: XCTestCase {
             
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let resultApi = APIResponse(api: BattleAPI.battleResult.rawValue, parameter: param, json: json)
+            let resultApi = APIResponse(api: API(rawValue: RawAPI.battleResult.rawValue), parameter: param, json: json)
             GuardShelterCommand(apiResponse: resultApi).execute()
             
-            let goBackApi = APIResponse(api: GuardEscapeAPI.gobakAlone.rawValue, parameter: param, json: json)
+            let goBackApi = APIResponse(api: API(rawValue: RawAPI.gobakAlone.rawValue), parameter: param, json: json)
             GuardShelterCommand(apiResponse: goBackApi).execute()
         }
         
index 6fdf51c..9d7ec79 100644 (file)
@@ -62,7 +62,7 @@ class NormalBattleTest: XCTestCase {
             let param = Parameter(paramValue)
             XCTAssertEqual(param["api_deck_id"].string, "\(fleet)")
             
-            let api = APIResponse(api: MapAPI.start.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.start.rawValue), parameter: param, json: json)
             XCTAssertEqual(api.json, json)
             XCTAssertEqual(api.parameter, param)
             
@@ -148,7 +148,7 @@ class NormalBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.battle.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.battle.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -177,7 +177,7 @@ class NormalBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.midnightBattle.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.midnightBattle.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -190,7 +190,7 @@ class NormalBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.battleResult.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.battleResult.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -259,7 +259,7 @@ class NormalBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.midnightBattle.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.midnightBattle.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()
@@ -272,7 +272,7 @@ class NormalBattleTest: XCTestCase {
             ]
             guard let json = JSON(rawValue: rawValue) else { return XCTFail("json is nil") }
             let param = Parameter(["Test": "Test"])
-            let api = APIResponse(api: BattleAPI.battleResult.rawValue, parameter: param, json: json)
+            let api = APIResponse(api: API(endpointPath: Endpoint.battleResult.rawValue), parameter: param, json: json)
             
             let command = BattleCommand(apiResponse: api)
             command.execute()