OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / DockInformationFutures.swift
1 //
2 //  DockInformationFutures.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2018/01/14.
6 //  Copyright © 2018年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 /// 値にはType名が入る
12 enum DockInformationError: Error {
13     
14     case outOfBounds(String)
15     
16     case canNotCreate(String)
17 }
18
19 protocol DockInformationFutureCreatable {
20     
21     static func valid(number: Int) -> Bool
22     static func alreadyHasData(for: Int) -> Bool
23     
24     init?(number: Int)
25 }
26
27 func createDockInformationFuture<T: DockInformationFutureCreatable>(number: Int) -> Future<T> {
28     
29     guard T.valid(number: number) else {
30         
31         return Future(DockInformationError.outOfBounds(String(describing: T.self)))
32     }
33     
34     if T.alreadyHasData(for: number) {
35         
36         if let status = T.init(number: number) {
37             
38             return Future(status)
39             
40         } else {
41             
42             return Future(DockInformationError.canNotCreate(String(describing: T.self)))
43         }
44     }
45     
46     return ServerDataStore.default.future { _ -> T? in
47         
48         guard T.alreadyHasData(for: number) else { return .none }
49         
50         guard let status = T.init(number: number) else {
51             
52             throw DockInformationError.canNotCreate(String(describing: T.self))
53         }
54         
55         return status
56     }
57 }
58
59 extension MissionStatus: DockInformationFutureCreatable {
60     
61     static func alreadyHasData(for number: Int) -> Bool {
62         
63         return ServerDataStore.default.deck(by: number) != nil
64     }
65 }
66
67 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
68     
69     return createDockInformationFuture(number: number)
70 }
71
72 extension NyukyoDockStatus: DockInformationFutureCreatable {
73     
74     static func alreadyHasData(for number: Int) -> Bool {
75         
76         return ServerDataStore.default.nyukyoDock(by: number) != nil
77     }
78 }
79
80 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
81     
82     return createDockInformationFuture(number: number)
83 }
84
85 extension KenzoDockStatus: DockInformationFutureCreatable {
86         
87     static func alreadyHasData(for number: Int) -> Bool {
88         
89         return ServerDataStore.default.kenzoDock(by: number) != nil
90     }
91 }
92
93 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
94     
95     return createDockInformationFuture(number: number)
96 }