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 guard T.valid(number: number) else {
31 return Future(DockInformationError.outOfBounds(String(describing: T.self)))
34 if T.alreadyHasData(for: number) {
36 if let status = T.init(number: number) {
42 return Future(DockInformationError.canNotCreate(String(describing: T.self)))
46 return ServerDataStore.default.future { _ -> T? in
48 guard T.alreadyHasData(for: number) else { return .none }
50 guard let status = T.init(number: number) else {
52 throw DockInformationError.canNotCreate(String(describing: T.self))
59 extension MissionStatus: DockInformationFutureCreatable {
61 static func alreadyHasData(for number: Int) -> Bool {
63 return ServerDataStore.default.deck(by: number) != nil
67 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
69 return createDockInformationFuture(number: number)
72 extension NyukyoDockStatus: DockInformationFutureCreatable {
74 static func alreadyHasData(for number: Int) -> Bool {
76 return ServerDataStore.default.nyukyoDock(by: number) != nil
80 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
82 return createDockInformationFuture(number: number)
85 extension KenzoDockStatus: DockInformationFutureCreatable {
87 static func alreadyHasData(for number: Int) -> Bool {
89 return ServerDataStore.default.kenzoDock(by: number) != nil
93 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
95 return createDockInformationFuture(number: number)