Files
music-agregator/cmd/music-agregator/main.go
T
2026-05-04 22:48:14 +02:00

96 lines
2.0 KiB
Go

package main
import (
"flag"
"fmt"
"net"
"os"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"google.golang.org/grpc"
"gopkg.in/yaml.v2"
// My modules
"homelab.lan/music-agregator/internal"
"homelab.lan/music-agregator/internal/config"
"homelab.lan/music-agregator/internal/hello"
"homelab.lan/music-agregator/internal/indexer"
appRouter "homelab.lan/music-agregator/internal/router"
)
func main() {
log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).
With().Timestamp().Logger()
configPath := flag.String("config", "", "Path to the config file")
flag.Parse()
cfg, err := parseConfig(configPath)
if err != nil {
log.Fatal().Err(err).Msg("Failed to load config")
}
log.Info().Interface("config", cfg).Msg("Loaded config")
// start the grpc in another thread to not block the next http start
go serveGrpc(*cfg)
serveHttp()
}
func serveHttp() {
router := gin.Default()
appRouter.SetupRoutes(router)
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
router.Run()
}
func serveGrpc(config config.Config) {
var opts []grpc.ServerOption
server := grpc.NewServer(opts...)
indexerServer, err := indexer.NewIndexerServer(config)
if err != nil {
log.Fatal().Err(err).Msg("Failed to create IndexerServer")
}
services := []internal.Registrable{
hello.NewHelloServer(),
indexerServer,
}
for _, service := range services {
service.Register(server)
}
listener, err := net.Listen("tcp", fmt.Sprintf("%v:%v", config.App.Host, config.App.Port))
if err != nil {
log.Fatal().Err(err).Msg("Failed to listen on localhost:8081")
}
server.Serve(listener)
}
func parseConfig(path *string) (*config.Config, error) {
f, err := os.Open(*path)
if err != nil {
log.Error().Str("path", *path).Msg("Unable to opent config by path")
return nil, err
}
defer f.Close()
cfg := config.NewConfig()
decoder := yaml.NewDecoder(f)
err = decoder.Decode(&cfg)
if err != nil {
// processError(err)
}
return cfg, nil
}