// main.go package main import ( "fmt" "os" "github.com/yyc12345/coconut-leaf/backend/cli" "github.com/yyc12345/coconut-leaf/backend/config" "github.com/yyc12345/coconut-leaf/backend/database" "github.com/yyc12345/coconut-leaf/backend/logger" "github.com/yyc12345/coconut-leaf/backend/server" "github.com/yyc12345/coconut-leaf/backend/utils" ) func main() { args := cli.Parse() cfg, err := config.Load(args.Config) if err != nil { fmt.Fprintln(os.Stderr, "error loading config file:", err) os.Exit(1) } // Splash is printed directly; the logger is not built yet. fmt.Println("Coconut-leaf") fmt.Println("A light, self-host and multi-account calendar system") fmt.Println("Project: https://github.com/yyc12345/coconut-leaf") fmt.Println("===================") // Build the logger from the loaded config. loggerLevel := logger.Production if cfg.Others.Debug { loggerLevel = logger.Development } log := logger.New(loggerLevel) // Create the database backend selected by the config. deps := database.Deps{Cfg: cfg, Logger: log} var db database.Database switch cfg.Database.Driver { case config.DatabaseDriverSqlite: db, err = database.NewSqlite3Database(deps) case config.DatabaseDriverMysql: db, err = database.NewMysqlDatabase(deps) default: log.Error("unknown database driver", "driver", cfg.Database.Driver) os.Exit(1) } if err != nil { log.Error("failed to open database", "error", err) os.Exit(1) } // Initialize the schema and first admin user when requested. if args.Init { if !utils.IsValidUsername(args.Username) { log.Error("invalid init username") os.Exit(1) } if !utils.IsValidPassword(args.Password) { log.Error("invalid init password") os.Exit(1) } if err := db.Init(args.Username, args.Password); err != nil { log.Error("failed to initialize database", "error", err) os.Exit(1) } } // Serve. defer db.Close() log.Info("Starting server...") handler := &server.Handler{DB: db, Logger: log, Cfg: cfg} if err := server.Run(handler); err != nil { log.Error("server stopped with error", "error", err) os.Exit(1) } }