cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists 馃崈
charm
leaflet
readability
golang
1package utils
2
3import (
4 "context"
5 "os"
6 "strings"
7
8 "github.com/charmbracelet/log"
9 "github.com/stormlightlabs/noteleaf/internal/models"
10 "github.com/stormlightlabs/noteleaf/internal/repo"
11 "golang.org/x/text/cases"
12 "golang.org/x/text/language"
13)
14
15// Logger is the global application logger
16var Logger *log.Logger
17
18// NewLogger creates a new logger with the specified level and format
19func NewLogger(level string, format string) *log.Logger {
20 logger := log.New(os.Stderr)
21
22 switch strings.ToLower(level) {
23 case "debug":
24 logger.SetLevel(log.DebugLevel)
25 case "info":
26 logger.SetLevel(log.InfoLevel)
27 case "warn", "warning":
28 logger.SetLevel(log.WarnLevel)
29 case "error":
30 logger.SetLevel(log.ErrorLevel)
31 default:
32 logger.SetLevel(log.InfoLevel)
33 }
34
35 // Set format
36 if format == "json" {
37 logger.SetFormatter(log.JSONFormatter)
38 } else {
39 logger.SetFormatter(log.TextFormatter)
40 logger.SetReportTimestamp(true)
41 }
42
43 return logger
44}
45
46// GetLogger returns the global logger, creating a default one if it doesn't exist
47func GetLogger() *log.Logger {
48 if Logger == nil {
49 Logger = NewLogger("info", "text")
50 }
51 return Logger
52}
53
54func Titlecase(s string) string {
55 return cases.Title(language.Und, cases.NoLower).String(s)
56}
57
58// TestTaskRepository interface for dependency injection in tests
59type TestTaskRepository interface {
60 List(ctx context.Context, options repo.TaskListOptions) ([]*models.Task, error)
61 Update(ctx context.Context, task *models.Task) error
62}
63
64// TestBookRepository interface for dependency injection in tests
65type TestBookRepository interface {
66 List(ctx context.Context, options repo.BookListOptions) ([]*models.Book, error)
67}
68
69// TestNoteRepository interface for dependency injection in tests
70type TestNoteRepository interface {
71 List(ctx context.Context, options repo.NoteListOptions) ([]*models.Note, error)
72}