look command

This commit is contained in:
2023-05-21 15:11:10 +09:00
parent 305d224b5d
commit ad4ea75bd4
2 changed files with 72 additions and 12 deletions

View File

@@ -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
}
}

View File

@@ -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)")
}
}
}
}