-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.go
100 lines (83 loc) · 2.38 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"github.com/spf13/cobra"
"github.com/spf13/viper"
"log/slog"
"manala/app/api"
"manala/cmd"
cmdDocs "manala/cmd/docs"
cmdInit "manala/cmd/init"
cmdList "manala/cmd/list"
cmdMascot "manala/cmd/mascot"
cmdUpdate "manala/cmd/update"
cmdWatch "manala/cmd/watch"
"manala/internal/cache"
"manala/internal/notifier"
"manala/internal/ui/adapters/charm"
"manala/internal/ui/log"
"os"
)
// Set at build time, by goreleaser, via ldflags
var version = "dev"
// Default repository url
const defaultRepositoryUrl = "https://github.com/manala/manala-recipes.git"
func main() {
// Streams
in, out, err := os.Stdin, os.Stdout, os.Stderr
// User interface
ui := charm.New(in, out, err)
// Notify
notify := notifier.NewBeeep("Manala")
var (
appLog = new(slog.Logger)
appApi = new(api.Api)
)
// App commands
appCmd := cmd.NewCmd(version, in, out, err)
appCmd.AddCommand(
cmdInit.NewCmd(appLog, appApi, ui),
cmdList.NewCmd(appLog, appApi, ui),
cmdMascot.NewCmd(),
cmdUpdate.NewCmd(appLog, appApi),
cmdWatch.NewCmd(appLog, appApi, ui, notify),
)
// App commands persistent flags
appCmd.PersistentFlags().StringP("cache-dir", "c", "", "use cache directory")
appCmd.PersistentFlags().BoolP("debug", "d", false, "set debug mode")
// Docs app command only available in dev
if version == "dev" {
appCmd.AddCommand(cmdDocs.NewCmd(appCmd))
}
cobra.OnInitialize(func() {
// Viper
_ = viper.BindPFlag("cache_dir", appCmd.PersistentFlags().Lookup("cache-dir"))
_ = viper.BindPFlag("debug", appCmd.PersistentFlags().Lookup("debug"))
viper.SetDefault("default_repository", defaultRepositoryUrl)
// Viper - Env
viper.AutomaticEnv()
viper.SetEnvPrefix("MANALA")
// App cache
appCache := cache.New(viper.GetString("cache_dir")).
WithUserDir("manala")
// Deferred app log instantiation
appLogHandler := log.NewSlogHandler(ui,
log.WithSlogHandlerDebug(viper.GetBool("debug")),
)
*appLog = *slog.New(appLogHandler)
// Deferred app api instantiation
*appApi = *api.New(appLog, appCache,
api.WithDefaultRepositoryUrl(viper.GetString("default_repository")),
)
// Log config
appLog.Debug("config",
"default_repository", viper.GetString("default_repository"),
"cache_dir", viper.GetString("cache_dir"),
"debug", viper.GetBool("debug"),
)
})
// Execute app command
if err := appCmd.Execute(); err != nil {
ui.Error(err)
os.Exit(1)
}
}