// weather_mapper.go - Fixed with exported map package main import ( "time" ) // WeatherMapper handles weather symbol mapping type WeatherMapper struct { symbolMap map[int]Weather } // NewWeatherMapper creates a new weather mapper func NewWeatherMapper() *WeatherMapper { return &WeatherMapper{ symbolMap: FmiToOwm, } } // Map converts FMI weather symbol to OWM weather with day/night icon func (wm *WeatherMapper) Map(symbol int, forecastTime, sunrise, sunset time.Time) Weather { weather, ok := wm.symbolMap[symbol] if !ok { weather = Weather{800, "Clear", "clear sky", "01"} } // Determine day/night isDay := !forecastTime.Before(sunrise) && forecastTime.Before(sunset) if isDay { weather.Icon += "d" } else { weather.Icon += "n" } return weather } // FmiToOwm is the global FMI to OpenWeatherMap mapping var FmiToOwm = map[int]Weather{ 1: {800, "Clear", "clear sky", "01"}, 2: {801, "Clouds", "few clouds", "02"}, 3: {802, "Clouds", "scattered clouds", "03"}, 4: {803, "Clouds", "broken clouds", "04"}, 5: {804, "Clouds", "overcast clouds", "04"}, 6: {701, "Mist", "mist", "50"}, 7: {701, "Mist", "mist", "50"}, 8: {741, "Fog", "fog", "50"}, 9: {741, "Fog", "fog", "50"}, 10: {741, "Fog", "fog", "50"}, 11: {300, "Drizzle", "light intensity drizzle", "09"}, 12: {301, "Drizzle", "drizzle", "09"}, 13: {302, "Drizzle", "heavy intensity drizzle", "09"}, 21: {520, "Rain", "light intensity shower rain", "09"}, 22: {521, "Rain", "shower rain", "09"}, 23: {522, "Rain", "heavy intensity shower rain", "09"}, 24: {511, "Rain", "freezing rain", "13"}, 25: {500, "Rain", "light rain", "10"}, 26: {501, "Rain", "moderate rain", "10"}, 27: {502, "Rain", "heavy intensity rain", "10"}, 30: {500, "Rain", "light rain", "10"}, 31: {501, "Rain", "moderate rain", "10"}, 32: {502, "Rain", "heavy intensity rain", "10"}, 40: {600, "Snow", "light snow", "13"}, 41: {600, "Snow", "light snow", "13"}, 42: {601, "Snow", "snow", "13"}, 43: {602, "Snow", "heavy snow", "13"}, 50: {300, "Drizzle", "drizzle", "09"}, 51: {300, "Drizzle", "light drizzle", "09"}, 52: {301, "Drizzle", "drizzle", "09"}, 53: {302, "Drizzle", "heavy drizzle", "09"}, 54: {302, "Drizzle", "heavy drizzle", "09"}, 55: {302, "Drizzle", "heavy drizzle", "09"}, 56: {313, "Rain", "freezing drizzle", "09"}, 57: {314, "Rain", "heavy freezing drizzle", "09"}, 58: {314, "Rain", "freezing drizzle", "09"}, 59: {314, "Rain", "freezing drizzle", "09"}, 60: {500, "Rain", "light rain", "10"}, 61: {501, "Rain", "moderate rain", "10"}, 62: {502, "Rain", "heavy rain", "10"}, 63: {503, "Rain", "very heavy rain", "10"}, 64: {504, "Rain", "extreme rain", "10"}, 65: {504, "Rain", "extreme rain", "10"}, 66: {511, "Rain", "freezing rain", "13"}, 67: {511, "Rain", "freezing rain", "13"}, 68: {611, "Snow", "sleet", "13"}, 69: {612, "Snow", "sleet", "13"}, 70: {600, "Snow", "light snow", "13"}, 71: {601, "Snow", "snow", "13"}, 72: {602, "Snow", "heavy snow", "13"}, 73: {615, "Snow", "rain and snow", "13"}, 74: {616, "Snow", "rain and snow", "13"}, 75: {620, "Snow", "light shower snow", "13"}, 76: {621, "Snow", "shower snow", "13"}, 77: {622, "Snow", "heavy shower snow", "13"}, 78: {622, "Snow", "heavy snow", "13"}, 79: {622, "Snow", "heavy snow", "13"}, 80: {520, "Rain", "light intensity shower rain", "09"}, 81: {521, "Rain", "shower rain", "09"}, 82: {522, "Rain", "heavy intensity shower rain", "09"}, 83: {611, "Rain", "sleet", "13"}, 84: {612, "Rain", "sleet", "13"}, 85: {621, "Snow", "shower snow", "13"}, 86: {622, "Snow", "heavy shower snow", "13"}, 87: {602, "Snow", "heavy snow", "13"}, 88: {602, "Snow", "heavy snow", "13"}, 91: {200, "Thunderstorm", "thunderstorm with light rain", "11"}, 92: {202, "Thunderstorm", "thunderstorm with heavy rain", "11"}, 93: {212, "Thunderstorm", "thunderstorm", "11"}, 94: {221, "Thunderstorm", "ragged thunderstorm", "11"}, }