Add environment variable "KISS_ASSERT_COMMA_CSV_DATA"

This commit is contained in:
2023-06-22 14:42:11 +09:00
parent 148fea2864
commit 0fc39aae9d
4 changed files with 30 additions and 8 deletions

View File

@@ -96,6 +96,10 @@ extension String {
}
return (hh, mm, ss)
}
public var hasComma: Bool {
return nil != rangeOfCharacter(from: commaCharSet)
}
}
@@ -168,21 +172,31 @@ extension FileManager {
}
private let commaCharSet = CharacterSet([","])
private var assertCommaCsvData: Bool = {
let val = ProcessInfo.processInfo.environment["KISS_ASSERT_COMMA_CSV_DATA"]
switch val {
case "true", "1": return true
case "false", "0": return false
default: return false
}
}()
private let commaCharSet = CharacterSet([","])
public func valueToString(_ any: Any) -> String {
func validateComma(_ s: String) -> String {
let comma: CharacterSet = [","]
if s.rangeOfCharacter(from: comma) != nil {
assertionFailure("There are comma in: \(s)")
func validateComma(_ s: String) {
if s.hasComma {
print("There are comma in: \(s)")
if assertCommaCsvData {
assertionFailure("There are comma in: \(s)")
}
}
return s
}
switch any {
case let s as String:
validateComma(s)
return s.trimmingCharacters(in: commaCharSet)
case let i as Int8: return String(i)
case let i as UInt8: return String(i)
@@ -202,6 +216,7 @@ public func valueToString(_ any: Any) -> String {
case let raw as any RawRepresentable:
switch raw.rawValue {
case let s as String:
validateComma(s)
return s.trimmingCharacters(in: commaCharSet)
case let i as Int8: return String(i)
case let i as UInt8: return String(i)
@@ -217,7 +232,9 @@ public func valueToString(_ any: Any) -> String {
return ""
}
case let c as CustomStringConvertible:
return c.description.trimmingCharacters(in: commaCharSet)
let s = c.description
validateComma(s)
return s.trimmingCharacters(in: commaCharSet)
default:
return ""
}

View File

@@ -135,6 +135,7 @@ extension ShopContext {
for items in products.values {
all.append(contentsOf: items)
}
all.sort(by: { $0.shortCode < $1.shortCode })
return all
}

View File

@@ -21,4 +21,8 @@ let data = try [CapturePrice].readCsv(fromFile: path, verifyHeader: true)
if let last = data.last {
print(last)
}
let shopProductsUrl = URL.currentDirectory().appending(path: "data/shop-products.csv")
let context = ShopContext()
context.loadShop(url: shopProductsUrl)
*/

View File

@@ -61,7 +61,7 @@ WIP `showcase` | 추천 상품을 제안함.
Environment variable | 설명
-------------------- | ---
KISS_RESPONSE_LOGGABLE | `true`, `1` 이면, API 응답로그를 기록함. `false`, `0` 이면 기록하지 않음. 기본값은 `false`.
KISS_ASSERT_COMMA_CSV_DATA | `true`, `1` 이면, CSV 데이터에 comma 문자가 감지되면 assertion 을 발생시킴. 기본값은 `false`.
# KissMeIndex