root.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package cmd
  2. import (
  3. "log/slog"
  4. "github.com/ayn2op/discordo/internal/config"
  5. "github.com/ayn2op/discordo/internal/consts"
  6. "github.com/ayn2op/discordo/internal/logger"
  7. "github.com/gdamore/tcell/v2"
  8. "github.com/rivo/tview"
  9. "github.com/spf13/cobra"
  10. "github.com/zalando/go-keyring"
  11. )
  12. var (
  13. discordState *State
  14. app *App
  15. )
  16. var (
  17. rootCmd = &cobra.Command{
  18. PreRunE: func(cmd *cobra.Command, args []string) error {
  19. flags := cmd.Flags()
  20. var level slog.Level
  21. switch s, _ := flags.GetString("log-level"); s {
  22. case "debug":
  23. level = slog.LevelDebug
  24. case "info":
  25. level = slog.LevelInfo
  26. case "warn":
  27. level = slog.LevelWarn
  28. case "error":
  29. level = slog.LevelError
  30. }
  31. var format logger.Format
  32. switch s, _ := flags.GetString("log-format"); s {
  33. case "text":
  34. format = logger.FormatText
  35. case "json":
  36. format = logger.FormatJson
  37. }
  38. return logger.Load(format, level)
  39. },
  40. RunE: func(cmd *cobra.Command, args []string) error {
  41. token, _ := cmd.Flags().GetString("token")
  42. if token == "" {
  43. var err error
  44. token, err = keyring.Get(consts.Name, "token")
  45. if err != nil {
  46. slog.Info("failed to retrieve token from keyring", "err", err)
  47. }
  48. }
  49. cfg, err := config.Load()
  50. if err != nil {
  51. return err
  52. }
  53. tview.Styles.PrimitiveBackgroundColor = tcell.GetColor(cfg.Theme.BackgroundColor)
  54. tview.Borders.Horizontal = cfg.Theme.Border.Preset.Horizontal
  55. tview.Borders.Vertical = cfg.Theme.Border.Preset.Vertical
  56. tview.Borders.TopLeft = cfg.Theme.Border.Preset.TopLeft
  57. tview.Borders.TopRight = cfg.Theme.Border.Preset.TopRight
  58. tview.Borders.BottomLeft = cfg.Theme.Border.Preset.BottomLeft
  59. tview.Borders.BottomRight = cfg.Theme.Border.Preset.BottomRight
  60. tview.Borders.HorizontalFocus = tview.Borders.Horizontal
  61. tview.Borders.VerticalFocus = tview.Borders.Vertical
  62. tview.Borders.TopLeftFocus = tview.Borders.TopLeft
  63. tview.Borders.TopRightFocus = tview.Borders.TopRight
  64. tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
  65. tview.Borders.BottomRightFocus = tview.Borders.BottomRight
  66. app = newApp(cfg)
  67. return app.run(token)
  68. },
  69. }
  70. Execute = rootCmd.Execute
  71. )
  72. func init() {
  73. flags := rootCmd.Flags()
  74. flags.StringP("token", "t", "", "the authentication token")
  75. flags.String("log-level", "info", "log level")
  76. flags.String("log-format", "text", "log format")
  77. }