OSDN Git Service

コード整形
[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             
72             // TODO: user filter and forEach
73             for c in registeredClasses {
74                 
75                 if c.canExecuteAPI(response.api) {
76                     
77                     return c.init(apiResponse: response)
78                 }
79             }
80             
81             if IgnoreCommand.canExecuteAPI(response.api) {
82                 
83                 return IgnoreCommand(apiResponse: response)
84                 
85             }
86             
87             return UnknownComand(apiResponse: response)
88         }
89         
90         #if ENABLE_JSON_LOG
91             return JSONViewCommand(apiResponse: response, command: concreteCommand(for: response))
92         #else
93             return concreteCommand(for: response)
94         #endif
95     }
96     
97     class func registerClass(_ commandClass: JSONCommand.Type) {
98         
99         if registeredClasses.contains(where: { $0 == commandClass }) { return }
100         
101         registeredClasses.append(commandClass)
102     }
103 }