OSDN Git Service

ebdb658dde2d32c51fdd55ebcc046472fd8cae2c
[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     let future = Future<T>()
30     
31     guard T.valid(number: number) else {
32         
33         future.failure(DockInformationError.outOfBounds(String(describing: T.self)))
34         return future
35     }
36     
37     if T.alreadyHasData(for: number) {
38         
39         if let status = T.init(number: number) {
40             
41             future.success(status)
42             
43         } else {
44             
45             future.failure(DockInformationError.canNotCreate(String(describing: T.self)))
46         }
47         
48         return future
49     }
50     
51     future.waitingCoreData { _ in
52         
53         guard T.alreadyHasData(for: number) else { return .none }
54             
55         guard let status = T.init(number: number) else {
56             
57             return .error(DockInformationError.canNotCreate(String(describing: T.self)))
58         }
59         
60         return .value(status)
61     }
62     
63     return future
64 }
65
66 extension MissionStatus: DockInformationFutureCreatable {
67     
68     static func alreadyHasData(for number: Int) -> Bool {
69         
70         return ServerDataStore.default.deck(by: number) != nil
71     }
72 }
73
74 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
75     
76     return createDockInformationFuture(number: number)
77 }
78
79 extension NyukyoDockStatus: DockInformationFutureCreatable {
80     
81     static func alreadyHasData(for number: Int) -> Bool {
82         
83         return ServerDataStore.default.nyukyoDock(by: number) != nil
84     }
85 }
86
87 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
88     
89     return createDockInformationFuture(number: number)
90 }
91
92 extension KenzoDockStatus: DockInformationFutureCreatable {
93         
94     static func alreadyHasData(for number: Int) -> Bool {
95         
96         return ServerDataStore.default.kenzoDock(by: number) != nil
97     }
98 }
99
100 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
101     
102     return createDockInformationFuture(number: number)
103 }