diff --git a/KissMe/Common/Extensions.swift b/KissMe/Common/Extensions.swift index 7d24e03..2642f7b 100644 --- a/KissMe/Common/Extensions.swift +++ b/KissMe/Common/Extensions.swift @@ -9,23 +9,27 @@ import Foundation extension Date { - var yyyyMMdd: String { + public var yyyyMMdd: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" return dateFormatter.string(from: self) } - var yyyyMMdd_HHmmss: String { + public var yyyyMMdd_HHmmss: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" return dateFormatter.string(from: self) } - var yyyyMMdd_HHmmssSSSS_forFile: String { + public var yyyyMMdd_HHmmssSSSS_forFile: String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyyMMdd_HHmmss_SSSS" return dateFormatter.string(from: self) } + + public static var appTime: TimeInterval { + ProcessInfo.processInfo.systemUptime + } } diff --git a/KissMeConsole/KissMeConsole/KissConsole.swift b/KissMeConsole/KissMeConsole/KissConsole.swift index 4d6d6b3..35af3ac 100644 --- a/KissMeConsole/KissMeConsole/KissConsole.swift +++ b/KissMeConsole/KissMeConsole/KissConsole.swift @@ -15,7 +15,7 @@ class KissConsole { var shop: KissShop? = nil var productsLock = NSLock() - var products: [DomesticShop.Product] = [] + var products = [String: [DomesticShop.Product]]() enum KissCommand: String { case quit = "quit" @@ -27,6 +27,7 @@ class KissConsole { case sell = "sell" case loadShop = "load shop" case updateShop = "update shop" + case look = "look" var needLogin: Bool { switch self { @@ -34,7 +35,7 @@ class KissConsole { return false case .logout, .search, .buy, .sell: return true - case .loadShop, .updateShop: + case .loadShop, .updateShop, .look: return false } } @@ -50,6 +51,7 @@ class KissConsole { createSubpath("log") createSubpath("data") + onLoadShop() } func run() { @@ -83,6 +85,7 @@ class KissConsole { case .sell: await onSell(args.suffixStrings(from: 1)) case .loadShop: onLoadShop() case .updateShop: await onUpdateShop() + case .look: await onLook(args.suffixStrings(from: 1)) default: print("Unknown command: \(single)") } @@ -106,22 +109,58 @@ extension KissConsole { URL.currentDirectory().appending(path: "data/shop-products.csv") } - private func loadShop() { + private func setProducts(_ products: [String: [DomesticShop.Product]]) { + productsLock.lock() + self.products = products + productsLock.unlock() + } + + private func getProducts(similarName: String) -> [String: [DomesticShop.Product]]? { + productsLock.lock() + defer { + productsLock.unlock() + } + return products.filter { $0.key.contains(similarName) } + } + + private func loadShop(_ profile: Bool = true) { + let appTime1 = Date.appTime guard let stringCsv = try? String(contentsOfFile: shopProducts.path) else { return } + + let appTime2 = Date.appTime + if profile { + print("\tloading file \(appTime2 - appTime1) elapsed") + } - var products = [DomesticShop.Product]() + var products = [String: [DomesticShop.Product]]() let rows = stringCsv.split(separator: "\n") + + let appTime3 = Date.appTime + if profile { + print("\trow split \(appTime3 - appTime2) elapsed") + } + for row in rows { let array = row.split(separator: ",").map { String($0) } let product = DomesticShop.Product(array) - products.append(product) + if var value = products[product.itemName] { + value.append(product) + products.updateValue(value, forKey: product.itemName) + } + else { + products[product.itemName] = [product] + } } - self.productsLock.lock() - self.products = products - self.productsLock.unlock() - print("load products \(products.count)") + let appTime4 = Date.appTime + if profile { + print("\tparse product \(appTime4 - appTime3) elapsed") + } + + setProducts(products) + let totalCount = products.reduce(0, { $0 + $1.value.count }) + print("load products \(totalCount) with \(products.count) key") } } @@ -225,6 +264,23 @@ extension KissConsole { print("\(error)") } } + + private func onLook(_ args: [String]) async { + guard args.count >= 1 else { + print("No product name") + return + } + guard let items = getProducts(similarName: args[0]) else { + print("") + return + } + for item in items { + print("Product \(item.key)") + for value in item.value { + print("\t\(value.shortCode) \(value.baseDate)") + } + } + } }