Files
mysubaru-mq/main.go
2025-05-21 13:51:10 -04:00

134 lines
3.1 KiB
Go

// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023 mysubarumq
// SPDX-FileContributor: alex-savin
package main
import (
"fmt"
"log/slog"
"os"
"os/signal"
"strconv"
"syscall"
"git.savin.nyc/alex/mysubaru-mq/app"
"git.savin.nyc/alex/mysubaru-mq/bus"
"git.savin.nyc/alex/mysubaru-mq/config"
"git.savin.nyc/alex/mysubaru-mq/hooks/debug"
"git.savin.nyc/alex/mysubaru-mq/listeners"
"git.savin.nyc/alex/mysubaru-mq/workers"
)
// var log = *slog.Logger
var cfg = &config.Config{}
const (
LoggingOutputJson = "JSON"
LoggingOutputText = "TEXT"
)
func configureLogging(config *config.Logging) *slog.Logger { //nolint:unparam
if config == nil {
return nil
}
var level slog.Level
if err := level.UnmarshalText([]byte(config.Level)); err != nil {
slog.Warn(err.Error())
slog.Warn(fmt.Sprintf("logging level not recognized, defaulting to level %s", slog.LevelInfo.String()))
level = slog.LevelInfo
}
var handler slog.Handler
switch config.Output {
case LoggingOutputJson:
handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
case LoggingOutputText:
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
default:
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
}
return slog.New(handler)
}
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
done <- true
}()
var err error
cfg, err = config.New()
if err != nil { // Handle errors reading the config file
slog.Error("Fatal error config file", "error", err.Error())
os.Exit(1)
}
logger := configureLogging(cfg.Logging)
evBus := bus.New()
app := app.New(cfg, evBus, logger)
// app.Log = logger
mqtt := workers.NewMQTTClient("mqtt", evBus, cfg)
err = app.AddWorker(mqtt)
if err != nil {
app.Log.Error(err.Error())
os.Exit(1)
}
mysubaru := workers.NewMySubaruClient("mysubaru", evBus, cfg)
err = app.AddWorker(mysubaru)
if err != nil {
app.Log.Error(err.Error())
os.Exit(1)
}
if len(cfg.Listeners) > 0 {
for name, opts := range cfg.Listeners {
listener := listeners.NewHTTPStats(name, ":"+strconv.Itoa(opts.Port), nil, app.Info)
err = app.AddListener(listener)
if err != nil {
app.Log.Error(err.Error())
}
}
}
err = app.AddHook(new(debug.Hook), nil)
if err != nil {
app.Log.Error(err.Error())
}
// err = app.AddHook(new(consul.Hook), &consul.Options{
// Hostname: cfg.Consul.Host,
// Port: cfg.Consul.Port,
// DC: cfg.Consul.DataCenter,
// ServiceID: "srv-mysubaru-01",
// NodeName: "mysubaru",
// Tags: []string{"mysubaru", "hassio", "mqtt"},
// LocalHost: cfg.Consul.Interfaces.WAN,
// LocalPort: cfg.Listeners["stats"].Port,
// })
// if err != nil {
// app.Log.Error(err.Error())
// }
go func() {
err := app.Serve()
if err != nil {
app.Log.Error(err.Error())
}
}()
<-done
app.Log.Warn("caught signal, stopping...")
_ = app.Close()
app.Log.Info("main.go finished")
}