package weather import ( "time" ) // PublisherConfig configuration for the publisher type PublisherConfig struct { // FMI API FMIEndpoint string `env:"FMI_ENDPOINT"` // Observation StationID int `env:"STATION_ID"` ObsPollEvery time.Duration `env:"OBS_POLL_EVERY"` ObsSafetyLag time.Duration `env:"OBS_SAFETY_LAG"` ObsTimestep int `env:"OBS_TIMESTEP"` WatermarkFile string `env:"WATERMARK_FILE"` // Forecast FcPollEvery time.Duration `env:"FC_POLL_EVERY"` HelLat float64 `env:"HEL_LAT"` HelLon float64 `env:"HEL_LON"` // MQTT MQTTBroker string `env:"MQTT_BROKER"` MQTTClientID string `env:"MQTT_CLIENT_ID"` MQTTUsername string `env:"MQTT_USERNAME"` MQTTPassword string `env:"MQTT_PASSWORD"` MQTTKeepAlive time.Duration `env:"MQTT_KEEP_ALIVE"` MQTTSessionExp time.Duration `env:"MQTT_SESSION_EXP"` // Application LogLevel string `env:"LOG_LEVEL"` HTTPTimeout time.Duration `env:"HTTP_TIMEOUT"` } // SubscriberConfig configuration for the subscriber type SubscriberConfig struct { // MQTT Configuration MQTTBroker string `env:"MQTT_BROKER"` MQTTClientID string `env:"MQTT_CLIENT_ID"` MQTTUsername string `env:"MQTT_USERNAME"` MQTTPassword string `env:"MQTT_PASSWORD"` MQTTKeepAlive time.Duration `env:"MQTT_KEEP_ALIVE"` MQTTSessionExp time.Duration `env:"MQTT_SESSION_EXP"` // Subscription Configuration Topics []string `env:"SUBSCRIBE_TOPICS"` QoS int `env:"SUBSCRIBE_QOS"` // Application LogLevel string `env:"LOG_LEVEL"` EnableDebug bool `env:"ENABLE_DEBUG"` } // LoadPublisherConfig loads publisher configuration from environment func LoadPublisherConfig() *PublisherConfig { cfg := &PublisherConfig{ FMIEndpoint: GetEnv("FMI_ENDPOINT", "https://opendata.fmi.fi/wfs"), StationID: ParseInt(GetEnv("STATION_ID", "100968")), ObsPollEvery: ParseDuration(GetEnv("OBS_POLL_EVERY", "5m")), ObsSafetyLag: ParseDuration(GetEnv("OBS_SAFETY_LAG", "2m")), ObsTimestep: ParseInt(GetEnv("OBS_TIMESTEP", "60")), WatermarkFile: GetEnv("WATERMARK_FILE", "obs_watermark.txt"), FcPollEvery: ParseDuration(GetEnv("FC_POLL_EVERY", "1h")), HelLat: ParseFloat(GetEnv("HEL_LAT", "60.1699")), HelLon: ParseFloat(GetEnv("HEL_LON", "24.9384")), MQTTBroker: GetEnv("MQTT_BROKER", "tcp://localhost:1883"), MQTTClientID: GetEnv("MQTT_CLIENT_ID", "fmi-publisher"), MQTTUsername: GetEnv("MQTT_USERNAME", ""), MQTTPassword: GetEnv("MQTT_PASSWORD", ""), MQTTKeepAlive: ParseDuration(GetEnv("MQTT_KEEP_ALIVE", "60s")), MQTTSessionExp: ParseDuration(GetEnv("MQTT_SESSION_EXP", "1h")), LogLevel: GetEnv("LOG_LEVEL", "info"), HTTPTimeout: ParseDuration(GetEnv("HTTP_TIMEOUT", "30s")), } return cfg } // LoadSubscriberConfig loads subscriber configuration from environment func LoadSubscriberConfig() *SubscriberConfig { qos := ParseInt(GetEnv("SUBSCRIBE_QOS", "1")) if qos < 0 || qos > 2 { qos = 1 } cfg := &SubscriberConfig{ MQTTBroker: GetEnv("MQTT_BROKER", "tcp://localhost:1883"), MQTTClientID: GetEnv("MQTT_CLIENT_ID", "fmi-subscriber"), MQTTUsername: GetEnv("MQTT_USERNAME", ""), MQTTPassword: GetEnv("MQTT_PASSWORD", ""), MQTTKeepAlive: ParseDuration(GetEnv("MQTT_KEEP_ALIVE", "60s")), MQTTSessionExp: ParseDuration(GetEnv("MQTT_SESSION_EXP", "1h")), Topics: ParseTopics(GetEnv("SUBSCRIBE_TOPICS", "")), QoS: qos, LogLevel: GetEnv("LOG_LEVEL", "info"), EnableDebug: GetEnv("ENABLE_DEBUG", "false") == "true", } return cfg }