OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / TSVSupport.swift
index abdb3cb..d9ba17b 100644 (file)
@@ -7,6 +7,7 @@
 //
 
 import Cocoa
+import Doutaku
 
 private struct LFSeparateLine {
     
@@ -47,7 +48,6 @@ private struct LFSeparateLine {
     }
 }
 
-// swiftlint:disable type_body_length
 final class TSVSupport {
     
     private let store = LocalDataStore.oneTimeEditor()
@@ -65,18 +65,15 @@ final class TSVSupport {
         panel.allowedFileTypes = ["kcdlocaldata"]
         panel.begin {
             
-            guard $0 == .OK
-                else { return }
+            guard $0 == .OK else { return }
             
             panel.urls.forEach { url in
                 
-                guard let fileW = try? FileWrapper(url: url)
-                    else { return }
+                guard let fileW = try? FileWrapper(url: url) else { return }
                 
                 fileW.fileWrappers?.forEach {
                     
-                    guard let data = $0.value.regularFileContents
-                        else { return }
+                    guard let data = $0.value.regularFileContents else { return }
                     
                     switch $0.key {
                     case "kaihatu.tsv": self.registerKaihatuHistory(data)
@@ -97,14 +94,19 @@ final class TSVSupport {
         panel.allowedFileTypes = ["kcdlocaldata"]
         panel.begin {
             
-            guard $0 == .OK,
-                let url = panel.url
-                else { return }
-            guard let kaihatuHistory = self.dataOfKaihatuHistory(),
-                let kenzoHistory = self.dataOfKenzoHistory(),
-                let kenzoMark = self.dataOfKenzoMark(),
-                let dropShipHistory = self.dataOfDropShipHistory()
-                else { return }
+            guard $0 == .OK else { return }
+            guard let url = panel.url else { return }
+            
+            let data = self.store.sync { () -> (Data, Data, Data, Data)? in
+                
+                guard let kaihatuHistory = self.dataOfKaihatuHistory() else { return nil }
+                guard let kenzoHistory = self.dataOfKenzoHistory() else { return nil }
+                guard let kenzoMark = self.dataOfKenzoMark() else { return nil }
+                guard let dropShipHistory = self.dataOfDropShipHistory() else { return nil }
+                
+                return (kaihatuHistory, kenzoHistory, kenzoMark, dropShipHistory)
+            }
+            guard let (kaihatuHistory, kenzoHistory, kenzoMark, dropShipHistory) = data else { return }
             
             let fileW = FileWrapper(directoryWithFileWrappers: [:])
             fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
@@ -122,14 +124,14 @@ final class TSVSupport {
         }
     }
     
-    private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
+    private func localData<T, Value>(_ entity: Entity<T>, sortBy: KeyPath<T, Value>) -> [T] {
         
-        let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
+        let sortDesc = SortDescriptors(keyPath: sortBy, ascending: true)
         
-        guard let array = try? store.objects(of: entity, sortDescriptors: [sortDesc])
-            else {
-                print("Can not get \(entity.name)")
-                return []
+        guard let array = try? store.objects(of: entity, sortDescriptors: sortDesc) else {
+            
+            print("Can not get \(entity)")
+            return []
         }
         
         return array
@@ -137,7 +139,7 @@ final class TSVSupport {
     
     private func dataOfKaihatuHistory() -> Data? {
         
-        return localData(KaihatuHistory.entity)
+        return localData(KaihatuHistory.entity, sortBy: \KaihatuHistory.date)
             .map {
                 LFSeparateLine.empty
                     .append($0.date)
@@ -158,7 +160,7 @@ final class TSVSupport {
     
     private func dataOfKenzoHistory() -> Data? {
         
-        return localData(KenzoHistory.entity)
+        return localData(KenzoHistory.entity, sortBy: \KenzoHistory.date)
             .map {
             LFSeparateLine.empty
                 .append($0.date)
@@ -180,7 +182,7 @@ final class TSVSupport {
     
     private func dataOfKenzoMark() -> Data? {
         
-        return localData(KenzoMark.entity, sortBy: "kDockId")
+        return localData(KenzoMark.entity, sortBy: \KenzoMark.kDockId)
             .map {
             LFSeparateLine.empty
                 .append($0.date)
@@ -202,7 +204,7 @@ final class TSVSupport {
     
     private func dataOfDropShipHistory() -> Data? {
         
-        return localData(DropShipHistory.entity)
+        return localData(DropShipHistory.entity, sortBy: \DropShipHistory.date)
             .map {
                 LFSeparateLine.empty
                     .append($0.date)
@@ -223,30 +225,25 @@ final class TSVSupport {
     private func registerKaihatuHistory(_ data: Data) {
         
         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
-        let store = LocalDataStore.oneTimeEditor()
         array?.forEach {
             
             let attr = $0.components(separatedBy: "\t")
             
-            guard attr.count == 10,
-                let date = dateFomatter.date(from: attr[0]),
-                let fuel = Int(attr[1]),
-                let bull = Int(attr[2]),
-                let steel = Int(attr[3]),
-                let bauxite = Int(attr[4]),
-                let kaihatu = Int(attr[5]),
-                let flagLv = Int(attr[8]),
-                let commandLv = Int(attr[9])
-                else { return }
+            guard attr.count == 10 else { return }
+            guard let date = dateFomatter.date(from: attr[0]) else { return }
+            guard let fuel = Int(attr[1]) else { return }
+            guard let bull = Int(attr[2]) else { return }
+            guard let steel = Int(attr[3]) else { return }
+            guard let bauxite = Int(attr[4]) else { return }
+            guard let kaihatu = Int(attr[5]) else { return }
+            guard let flagLv = Int(attr[8]) else { return }
+            guard let commandLv = Int(attr[9]) else { return }
             
-            let p = NSPredicate(format: "date = %@", argumentArray: [date])
+            let predicate = Predicate(\KaihatuHistory.date, equalTo: date)
             
-            guard let oo = try? store.objects(of: KaihatuHistory.entity, predicate: p),
-                oo.count != 0
-                else { return }
-            
-            guard let obj = store.insertNewObject(for: KaihatuHistory.entity)
-                else { return }
+            guard let oo = try? store.objects(of: KaihatuHistory.entity, predicate: predicate) else { return }
+            guard oo.count != 0 else { return }
+            guard let obj = store.insertNewObject(for: KaihatuHistory.entity) else { return }
             
             obj.date = date
             obj.fuel = fuel
@@ -264,32 +261,27 @@ final class TSVSupport {
     private func registerKenzoHistory(_ data: Data) {
         
         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
-        let store = LocalDataStore.oneTimeEditor()
         
         array?.forEach {
             
             let attr = $0.components(separatedBy: "\t")
             
-            guard attr.count == 11,
-                let date = dateFomatter.date(from: attr[0]),
-                let fuel = Int(attr[1]),
-                let bull = Int(attr[2]),
-                let steel = Int(attr[3]),
-                let bauxite = Int(attr[4]),
-                let kaihatu = Int(attr[5]),
-                let sType = Int(attr[7]),
-                let flagLv = Int(attr[9]),
-                let commandLv = Int(attr[10])
-                else { return }
-            
-            let p = NSPredicate(format: "date = %@", argumentArray: [date])
+            guard attr.count == 11 else { return }
+            guard let date = dateFomatter.date(from: attr[0]) else { return }
+            guard let fuel = Int(attr[1]) else { return }
+            guard let bull = Int(attr[2]) else { return }
+            guard let steel = Int(attr[3]) else { return }
+            guard let bauxite = Int(attr[4]) else { return }
+            guard let kaihatu = Int(attr[5]) else { return }
+            guard let sType = Int(attr[7]) else { return }
+            guard let flagLv = Int(attr[9]) else { return }
+            guard let commandLv = Int(attr[10]) else { return }
             
-            guard let oo = try? store.objects(of: KenzoHistory.entity, predicate: p),
-                oo.count != 0
-                else { return }
+            let predicate = Predicate(\KenzoHistory.date, equalTo: date)
             
-            guard let obj = store.insertNewObject(for: KenzoHistory.entity)
-                else { return }
+            guard let oo = try? store.objects(of: KenzoHistory.entity, predicate: predicate) else { return }
+            guard oo.count != 0 else { return }
+            guard let obj = store.insertNewObject(for: KenzoHistory.entity) else { return }
             
             obj.date = date
             obj.fuel = fuel
@@ -308,33 +300,28 @@ final class TSVSupport {
     private func registerKenzoMark( _ data: Data) {
         
         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
-        let store = LocalDataStore.oneTimeEditor()
         
         array?.forEach {
             
             let attr = $0.components(separatedBy: "\t")
             
-            guard attr.count == 11,
-                let date = dateFomatter.date(from: attr[0]),
-                let fuel = Int(attr[1]),
-                let bull = Int(attr[2]),
-                let steel = Int(attr[3]),
-                let bauxite = Int(attr[4]),
-                let kaihatu = Int(attr[5]),
-                let shiId = Int(attr[6]),
-                let kDock = Int(attr[7]),
-                let flagLv = Int(attr[9]),
-                let commandLv = Int(attr[10])
-                else { return }
+            guard attr.count == 11 else { return }
+            guard let date = dateFomatter.date(from: attr[0]) else { return }
+            guard let fuel = Int(attr[1]) else { return }
+            guard let bull = Int(attr[2]) else { return }
+            guard let steel = Int(attr[3]) else { return }
+            guard let bauxite = Int(attr[4]) else { return }
+            guard let kaihatu = Int(attr[5]) else { return }
+            guard let shiId = Int(attr[6]) else { return }
+            guard let kDock = Int(attr[7]) else { return }
+            guard let flagLv = Int(attr[9]) else { return }
+            guard let commandLv = Int(attr[10]) else { return }
             
-            let p = NSPredicate(format: "date = %@", argumentArray: [date])
+            let predicate = Predicate(\KenzoMark.date, equalTo: date)
             
-            guard let oo = try? store.objects(of: KenzoMark.entity, predicate: p),
-                oo.count != 0
-                else { return }
-            
-            guard let obj = store.insertNewObject(for: KenzoMark.entity)
-                else { return }
+            guard let oo = try? store.objects(of: KenzoMark.entity, predicate: predicate) else { return }
+            guard oo.count != 0 else { return }
+            guard let obj = store.insertNewObject(for: KenzoMark.entity) else { return }
             
             obj.date = date
             obj.fuel = fuel
@@ -353,27 +340,22 @@ final class TSVSupport {
     private func registerDropShipHistory( _ data: Data) {
         
         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
-        let store = LocalDataStore.oneTimeEditor()
         
         array?.forEach {
             
             let attr = $0.components(separatedBy: "\t")
             
-            guard attr.count == 9,
-                let date = dateFomatter.date(from: attr[0]),
-                let mapInfo = Int(attr[3]),
-                let mapCell = Int(attr[4]),
-                let mark = Int(attr[7])
-                else { return }
-            
-            let p = NSPredicate(format: "date = %@", argumentArray: [date])
+            guard attr.count == 9 else { return }
+            guard let date = dateFomatter.date(from: attr[0]) else { return }
+            guard let mapInfo = Int(attr[3]) else { return }
+            guard let mapCell = Int(attr[4]) else { return }
+            guard let mark = Int(attr[7]) else { return }
             
-            guard let oo = try? store.objects(of: DropShipHistory.entity, predicate: p),
-                oo.count != 0
-                else { return }
+            let predicate = Predicate(\DropShipHistory.date, equalTo: date)
             
-            guard let obj = store.insertNewObject(for: DropShipHistory.entity)
-                else { return }
+            guard let oo = try? store.objects(of: DropShipHistory.entity, predicate: predicate) else { return }
+            guard oo.count != 0 else { return }
+            guard let obj = store.insertNewObject(for: DropShipHistory.entity) else { return }
             
             obj.date = date
             obj.shipName = attr[1]