App-side defensive price guard: drop grades outside 50-500p at decode (belt-and-braces vs relay regression)
This commit is contained in:
@@ -84,11 +84,15 @@ private struct RelayResponse: Codable {
|
||||
let prices: [String: Double]?
|
||||
|
||||
/// Map relay grade keys (E5/E10/DIESEL) to FuelType for ALL fuels the
|
||||
/// station sells — one fetch populates every fuel tab.
|
||||
/// station sells — one fetch populates every fuel tab. Defensive guard:
|
||||
/// any grade outside the 50–500 pence/litre band is dropped, so a relay
|
||||
/// regression (e.g. the band being removed server-side) can't re-poison
|
||||
/// the nationwide cheapest reference with 1.3p / 1589p garbage.
|
||||
var allPrices: [FuelType: Double] {
|
||||
var result: [FuelType: Double] = [:]
|
||||
if let prices {
|
||||
for (grade, value) in prices {
|
||||
guard (50...500).contains(value) else { continue }
|
||||
switch grade.uppercased() {
|
||||
case "E10": result[.e10] = value
|
||||
case "E5": result[.e5] = value
|
||||
@@ -98,7 +102,7 @@ private struct RelayResponse: Codable {
|
||||
}
|
||||
}
|
||||
// Backwards-compat: relay versions without `prices` still send `price`.
|
||||
if result.isEmpty, let price {
|
||||
if result.isEmpty, let price, (50...500).contains(price) {
|
||||
result[.e10] = price
|
||||
}
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user