feat: indicate Costco membership requirement
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import Foundation
|
||||
|
||||
/// Presentation-only notices derived from existing station metadata.
|
||||
///
|
||||
/// These do not alter `FuelStation`, persistence, filtering, sorting, or
|
||||
/// navigation. They are intentionally small and reusable so additional
|
||||
/// informational station notices can be added later from the UI layer.
|
||||
enum StationNotice: Identifiable, Equatable {
|
||||
case membershipRequired
|
||||
|
||||
var id: String {
|
||||
switch self {
|
||||
case .membershipRequired: return "membershipRequired"
|
||||
}
|
||||
}
|
||||
|
||||
var title: String {
|
||||
switch self {
|
||||
case .membershipRequired: return "Membership required"
|
||||
}
|
||||
}
|
||||
|
||||
var symbolName: String {
|
||||
switch self {
|
||||
case .membershipRequired: return "creditcard.fill"
|
||||
}
|
||||
}
|
||||
|
||||
static func notices(for station: FuelStation) -> [StationNotice] {
|
||||
isCostco(station) ? [.membershipRequired] : []
|
||||
}
|
||||
|
||||
static func isCostco(_ station: FuelStation) -> Bool {
|
||||
containsCostcoToken(station.brand) || containsCostcoToken(station.name)
|
||||
}
|
||||
|
||||
private static func containsCostcoToken(_ value: String) -> Bool {
|
||||
let tokens = value.uppercased().split { !$0.isLetter && !$0.isNumber }
|
||||
return tokens.contains("COSTCO")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user