OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / CommandRegister.swift
1 //
2 //  CommandRegister.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/08.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 enum JSONCommandError: Error {
12     
13     case canNotFindCommand
14 }
15
16 final class CommandRegister {
17     
18     private static var registeredClasses: [JSONCommand.Type] = []
19     
20     class func register() {
21         
22         registerClass(Start2Command.self)
23         registerClass(MemberNDockCommand.self)
24         registerClass(MemberKDockCommand.self)
25         registerClass(MemberDeckCommand.self)
26         registerClass(MemberMaterialCommand.self)
27         registerClass(MemberBasicCommand.self)
28         registerClass(MemberShipCommand.self)
29         registerClass(MemberSlotItemCommand.self)
30         registerClass(MemberShip2Command.self)
31         registerClass(MemberShip3Command.self)
32         registerClass(MemberRequireInfoCommand.self)
33         registerClass(CreateShipCommand.self)
34         registerClass(DestroyItem2Command.self)
35         registerClass(MapStartCommand.self)
36         registerClass(BattleCommand.self)
37         registerClass(GuardShelterCommand.self)
38         registerClass(MapInfoCommand.self)
39         registerClass(SetPlaneCommand.self)
40         registerClass(SetActionCommand.self)
41         registerClass(CreateSlotItemCommand.self)
42         registerClass(GetShipCommand.self)
43         registerClass(DestroyShipCommand.self)
44         registerClass(PowerUpCommand.self)
45         registerClass(RemodelSlotCommand.self)
46         registerClass(ShipDeckCommand.self)
47         registerClass(ChangeHenseiCommand.self)
48         registerClass(KaisouLockCommand.self)
49         registerClass(SlotResetCommand.self)
50         registerClass(CombinedCommand.self)
51         registerClass(SlotDepriveCommand.self)
52         registerClass(QuestListCommand.self)
53         registerClass(ClearItemGetComand.self)
54         registerClass(NyukyoStartCommand.self)
55         registerClass(HokyuChargeCommand.self)
56         registerClass(NyukyoSpeedChangeCommand.self)
57         registerClass(PortCommand.self)
58         registerClass(AirCorpsSupplyCommand.self)
59         registerClass(AirCorpsChangeNameCommand.self)
60     }
61     
62     class func command(for response: APIResponse) -> JSONCommand {
63         
64         func concreteCommand(for response: APIResponse) -> JSONCommand {
65             
66             if !response.success {
67                 
68                 return FailedCommand(apiResponse: response)
69             }
70             
71             if IgnoreCommand.canExecuteAPI(response.api) {
72                 
73                 return IgnoreCommand(apiResponse: response)
74             }
75             
76             if let c = registeredClasses.first(where: { $0.canExecuteAPI(response.api) }) {
77                 
78                 return c.init(apiResponse: response)
79             }
80             
81             return UnknownComand(apiResponse: response)
82         }
83         
84         #if ENABLE_JSON_LOG
85         
86             return JSONViewCommand(apiResponse: response, command: concreteCommand(for: response))
87         
88         #else
89         
90             return concreteCommand(for: response)
91         
92         #endif
93     }
94     
95     class func registerClass(_ commandClass: JSONCommand.Type) {
96         
97         if registeredClasses.contains(where: { $0 == commandClass }) {
98             
99             return
100         }
101         
102         registeredClasses.append(commandClass)
103     }
104 }