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 return ServerDataStore.default.future { _ -> Result<T>? 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)))
64 extension MissionStatus: DockInformationFutureCreatable {
66 static func alreadyHasData(for number: Int) -> Bool {
68 return ServerDataStore.default.deck(by: number) != nil
72 func createMissionSatusFuture(number: Int) -> Future<MissionStatus> {
74 return createDockInformationFuture(number: number)
77 extension NyukyoDockStatus: DockInformationFutureCreatable {
79 static func alreadyHasData(for number: Int) -> Bool {
81 return ServerDataStore.default.nyukyoDock(by: number) != nil
85 func createNyukyoDockStatusFuture(number: Int) -> Future<NyukyoDockStatus> {
87 return createDockInformationFuture(number: number)
90 extension KenzoDockStatus: DockInformationFutureCreatable {
92 static func alreadyHasData(for number: Int) -> Bool {
94 return ServerDataStore.default.kenzoDock(by: number) != nil
98 func createKenzoDockStatusFuture(number: Int) -> Future<KenzoDockStatus> {
100 return createDockInformationFuture(number: number)