OSDN Git Service

NotificationCenterからFuture<T>を取得できるようにした
[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     return ServerDataStore.default.future { _ -> Result<T> 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
64 extension MissionStatus: DockInformationFutureCreatable {
65     
66     static func alreadyHasData(for number: Int) -> Bool {
67         
68         return ServerDataStore.default.deck(by: number) != nil
69     }
70 }
71
72 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
73     
74     return createDockInformationFuture(number: number)
75 }
76
77 extension NyukyoDockStatus: DockInformationFutureCreatable {
78     
79     static func alreadyHasData(for number: Int) -> Bool {
80         
81         return ServerDataStore.default.nyukyoDock(by: number) != nil
82     }
83 }
84
85 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
86     
87     return createDockInformationFuture(number: number)
88 }
89
90 extension KenzoDockStatus: DockInformationFutureCreatable {
91         
92     static func alreadyHasData(for number: Int) -> Bool {
93         
94         return ServerDataStore.default.kenzoDock(by: number) != nil
95     }
96 }
97
98 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
99     
100     return createDockInformationFuture(number: number)
101 }