Implement "holiday", "holiday 20230617" command

This commit is contained in:
2023-06-15 07:05:20 +09:00
parent 9503f02f92
commit 5760daaf1f
11 changed files with 108 additions and 51 deletions

View File

@@ -285,39 +285,6 @@ extension String {
self = str.trimmingCharacters(in: .whitespacesAndNewlines)
}
/*
init(firstLineOfFile path: String) throws {
guard let handle = FileHandle(forReadingAtPath: path) else {
throw GeneralError.cannotReadFile
}
defer {
try? handle.close()
}
var readData = Data()
var headerString = ""
while (true) {
guard let data = try handle.read(upToCount: 512) else {
break
}
readData.append(data)
guard let part = String(data: readData, encoding: .utf8) else {
continue
}
if let range = part.range(of: "\n") {
headerString += part[..<range.lowerBound]
break
}
else {
headerString += part
}
}
self = headerString
}
*/
static func readCsvHeader(fromFile: URL) throws -> [String] {
let header = try String(firstLineOfFile: fromFile.path)
return header.split(separator: ",").map { String($0) }

View File

@@ -36,6 +36,10 @@ extension KissConsole {
URL.currentDirectory().appending(path: "data/localized-names.csv")
}
static var holidayUrl: URL {
URL.currentDirectory().appending(path: "data/holiday.csv")
}
static func productPriceUrl(productNo: String) -> URL {
let subPath = "data/\(productNo)/price"
let subFile = "\(subPath)/prices.csv"

View File

@@ -169,11 +169,29 @@ extension KissConsole {
func checkHoliday(_ date: Date) async throws -> Bool {
guard await KissContext.shared.targetDate.yyyyMMdd != date.yyyyMMdd else {
let day = date.yyyyMMdd
guard await KissContext.shared.targetDay != day else {
return await KissContext.shared.isHoliday
}
let isHoliday = try await account!.getHolyday(baseDate: date).isHoliday(date)
await KissContext.shared.updateHoliday(isHoliday, targetDate: date)
do {
let holidays = try [HolidyResult.OutputDetail].readCsv(fromFile: KissConsole.holidayUrl)
let isHoliday = try holidays.isHoliday(day)
await KissContext.shared.updateHoliday(isHoliday, targetDay: day)
return isHoliday
} catch {
print(error)
}
let result = try await account!.getHolyday(baseDate: day)
do {
try result.output?.writeCsv(toFile: KissConsole.holidayUrl, localized: localized)
} catch {
print(error)
}
let isHoliday = try result.isHoliday(day)
await KissContext.shared.updateHoliday(isHoliday, targetDay: day)
return isHoliday
}

View File

@@ -71,6 +71,9 @@ class KissConsole {
case updateShop = "update shop"
case look = "look"
//
case holiday = "holiday"
// ( )
case showcase = "showcase"
@@ -100,7 +103,7 @@ class KissConsole {
return true
case .shorts, .shortsAll:
return false
case .loadShop, .updateShop, .look:
case .loadShop, .updateShop, .look, .holiday:
return false
case .showcase:
return false
@@ -229,6 +232,7 @@ class KissConsole {
case .loadShop: await onLoadShop()
case .updateShop: await onUpdateShop()
case .look: await onLook(args)
case .holiday: await onHoliday(args)
case .showcase: await onShowcase()
case .loves: await onLoves()
@@ -940,6 +944,28 @@ extension KissConsole {
}
private func onHoliday(_ args: [String]) async {
var date = Date()
if args.count == 1, args[0].utf8.count == 8, let day = args[0].yyyyMMdd {
date.change(year: day.0, month: day.1, day: day.2)
}
let targetDay = (Date().yyyyMMdd == date.yyyyMMdd ? "today": date.yyyyMMdd)
do {
let holiday = try await checkHoliday(date)
if holiday {
print("DONE \(targetDay) is holiday")
}
else {
print("DONE \(targetDay) is business day")
}
} catch {
print(error)
}
}
private func onShowcase() async {
// TODO: write
}

View File

@@ -11,15 +11,15 @@ import Foundation
actor KissContext {
static let shared = KissContext()
private(set) var targetDate: Date = Date(timeIntervalSince1970: 0)
private(set) var targetDay: String = "00010101" // yyyyMMdd
private(set) var isHoliday: Bool = false
private(set) var isResuming: Bool = false
private init() { }
func updateHoliday(_ isHolyday: Bool, targetDate: Date) {
func updateHoliday(_ isHolyday: Bool, targetDay: String) {
self.isHoliday = isHolyday
self.targetDate = targetDate
self.targetDay = targetDay
}
func update(resuming: Bool) {