Skip to content
Snippets Groups Projects
config.go 1.99 KiB
package main

import (
	"fmt"
	"log/slog"

	"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
	"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
	"gopkg.in/ini.v1"
)

var (
	mqttClientID  = "z2m-" + uuid.New().String()
	ignoredTopics = []string{
		"bridge/groups",
		"bridge/definitions",
		"bridge/extensions",
		"bridge/info",
		"bridge/state",
		"bridge/logging",
		"bridge/config",
		"bridge/event",
		"bridge/log",
	}
)

type Config struct {
	brokerHost    string
	topic         string
	ignoredTopics []string
	logLevel      slog.Level
	brokerPort    int
	baseAddr      uuid.UUID
}

func parseConfig() (*Config, error) {
	// Default configuration
	config := Config{brokerHost: "mqtt", topic: "zigbee2mqtt", logLevel: slog.LevelError, brokerPort: 1883}
	// Parse the configuration file
	cfg, err := ini.Load(xaal.GetConfigDir() + "/z2m.ini")
	if err != nil {
		return nil, err
	}
	sec := cfg.Section(ini.DefaultSection)

	// NOTE: This parsing is painful to write, I should look for a better way to do it

	// broker
	broker, err := sec.GetKey("broker")
	if err == nil {
		config.brokerHost = broker.String()
	}
	// topic
	topic, err := sec.GetKey("topic")
	if err == nil {
		config.topic = topic.String()
	}
	// log level
	level, err := sec.GetKey("log_level")
	if err == nil {
		switch level.String() {
		case "DEBUG":
			config.logLevel = slog.LevelDebug
		case "INFO":
			config.logLevel = slog.LevelInfo
		case "WARN":
			config.logLevel = slog.LevelWarn
		default:
			config.logLevel = slog.LevelError
		}
	}
	// port
	port, err := sec.GetKey("port")
	if err == nil {
		value, err := port.Int()
		if err != nil {
			return nil, err
		}
		config.brokerPort = value
	}
	// base address
	addr, err := sec.GetKey("base_addr")
	if err == nil {
		baseAddr, err := uuid.FromString(addr.String())
		if err != nil {
			return nil, err
		}
		config.baseAddr = baseAddr
	}
	for _, topic := range ignoredTopics {
		config.ignoredTopics = append(config.ignoredTopics, fmt.Sprintf("%s/%s", config.topic, topic))
	}
	return &config, nil
}