erm/app/darktile/cmd/root.go
2024-10-21 03:15:19 -05:00

75 lines
1.5 KiB
Go

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
}