2 // DockInformationFutures.swift
5 // Created by Hori,Masaki on 2018/01/14.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
12 enum DockInformationError: Error {
14 case outOfBounds(String)
16 case canNotCreate(String)
19 protocol DockInformationFutureCreatable {
21 static func valid(number: Int) -> Bool
22 static func alreadyHasData(for: Int) -> Bool
27 func createDockInformationFuture<T: DockInformationFutureCreatable>(number: Int) -> Future<T> {
29 let future = Future<T>()
31 guard T.valid(number: number) else {
33 future.failure(DockInformationError.outOfBounds(String(describing: T.self)))
37 if T.alreadyHasData(for: number) {
39 if let status = T.init(number: number) {
41 future.success(status)
45 future.failure(DockInformationError.canNotCreate(String(describing: T.self)))
51 future.waitingCoreData { _ in
53 guard T.alreadyHasData(for: number) else { return .none }
55 guard let status = T.init(number: number) else {
57 return .error(DockInformationError.canNotCreate(String(describing: T.self)))
66 extension MissionStatus: DockInformationFutureCreatable {
68 static func alreadyHasData(for number: Int) -> Bool {
70 return ServerDataStore.default.deck(by: number) != nil
74 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
76 return createDockInformationFuture(number: number)
79 extension NyukyoDockStatus: DockInformationFutureCreatable {
81 static func alreadyHasData(for number: Int) -> Bool {
83 return ServerDataStore.default.nyukyoDock(by: number) != nil
87 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
89 return createDockInformationFuture(number: number)
92 extension KenzoDockStatus: DockInformationFutureCreatable {
94 static func alreadyHasData(for number: Int) -> Bool {
96 return ServerDataStore.default.kenzoDock(by: number) != nil
100 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
102 return createDockInformationFuture(number: number)