additional condition detail

This commit is contained in:
Emil Lerch 2026-01-03 12:39:59 -08:00
parent 62bae1fb99
commit 92d12e36bc
Signed by: lobo
GPG key ID: A7B62D657EF764F8

View file

@ -386,15 +386,49 @@ fn symbolCodeToWeatherCode(symbol: []const u8) types.WeatherCode {
fn symbolCodeToCondition(symbol: []const u8) []const u8 {
var it = std.mem.splitScalar(u8, symbol, '_');
const metno_weather_code = it.next().?;
const Prefix = enum {
heavy,
light,
none,
};
// Check for intensity prefix
const prefix: Prefix = if (std.mem.startsWith(u8, metno_weather_code, "heavy"))
.heavy
else if (std.mem.startsWith(u8, metno_weather_code, "light"))
.light
else
.none;
if (std.mem.eql(u8, metno_weather_code, "clearsky")) return "Clear";
if (std.mem.eql(u8, metno_weather_code, "partlycloudy")) return "Partly cloudy";
if (std.mem.eql(u8, metno_weather_code, "fair")) return "Fair";
if (std.mem.eql(u8, metno_weather_code, "cloudy")) return "Cloudy";
if (std.mem.eql(u8, metno_weather_code, "fog")) return "Fog";
if (std.mem.eql(u8, metno_weather_code, "thunder")) return "Thunderstorm";
if (std.mem.eql(u8, metno_weather_code, "rain")) return "Rain";
if (std.mem.eql(u8, metno_weather_code, "sleet")) return "Sleet";
if (std.mem.eql(u8, metno_weather_code, "snow")) return "Snow";
if (std.mem.indexOf(u8, metno_weather_code, "thunder") != null)
return switch (prefix) {
.heavy => "Heavy thunderstorm",
.light => "Light thunderstorm",
.none => "Thunderstorm",
};
if (std.mem.indexOf(u8, metno_weather_code, "rain") != null)
return switch (prefix) {
.heavy => "Heavy rain",
.light => "Light rain",
.none => "Rain",
};
if (std.mem.indexOf(u8, metno_weather_code, "sleet") != null)
return switch (prefix) {
.heavy => "Heavy sleet",
.light => "Light sleet",
.none => "Sleet",
};
if (std.mem.indexOf(u8, metno_weather_code, "snow") != null)
return switch (prefix) {
.heavy => "Heavy snow",
.light => "Light snow",
.none => "Snow",
};
return "Unknown";
}
@ -487,17 +521,17 @@ test "hourly forecasts should have 4 entries per day" {
var checked: usize = 0;
for (weather_data.forecast) |day| {
if (day.hourly.len < 4) continue; // Skip incomplete days
try std.testing.expectEqual(@as(usize, 4), day.hourly.len);
// None should be "Unknown"
for (day.hourly) |hour| {
try std.testing.expect(!std.mem.eql(u8, hour.condition, "Unknown"));
}
checked += 1;
if (checked >= 3) break; // Check 3 complete days
}
try std.testing.expect(checked >= 2); // At least 2 complete days
}