diff --git a/src/weather/MetNo.zig b/src/weather/MetNo.zig index a0be8c4..e6ff05a 100644 --- a/src/weather/MetNo.zig +++ b/src/weather/MetNo.zig @@ -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 }