package cmd import ( "context" "fmt" "image" "log/slog" "os" "anime.bike/slogutil/slogenv" "gfx.cafe/util/go/fxplus" "github.com/lmittmann/tint" "go.uber.org/fx" "tuxpa.in/t/erm/app/darktile/config" "tuxpa.in/t/erm/app/darktile/gui" "tuxpa.in/t/erm/app/darktile/termutil" "tuxpa.in/t/erm/app/darktile/version" ) type Context struct { context.Context } type Root struct { Term Term `cmd:"" aliases:"t" default:"1" help:"launch term"` ListFonts ListFonts `cmd:"" aliases:"lf" name:"list-fonts" help:"list fonts"` } type Term struct { ShowVersion bool `name:"version" help:"Show erm version information and exit"` } func (r *Term) Run(ctx *Context) error { if r.ShowVersion { fmt.Println(version.Version) return nil } fxApp := fx.New( fxplus.WithLogger, fx.Provide( func() *slog.Logger { return slog.New(tint.NewHandler(os.Stdout, &tint.Options{ AddSource: true, Level: slogenv.EnvLevel(), })) }, fxplus.Context, // config.NewLark, termutil.New, gui.New, ), fx.Invoke(func(g *gui.GUI, s fx.Shutdowner, l *slog.Logger) { go func() { if err := g.Run(s); err != nil && !fxplus.IsShutdownOrCancel(err) { l.Error("fatal error running gui", "err", err) s.Shutdown(fx.ExitCode(1)) } s.Shutdown(fx.ExitCode(0)) }() })) fxApp.Run() return nil } func getImageFromFilePath(filePath string) (image.Image, error) { f, err := os.Open(filePath) if err != nil { return nil, err } defer f.Close() image, _, err := image.Decode(f) return image, err }