package spool import ( "fmt" "git.sr.ht/~ewy/pik/menu/style" "github.com/charmbracelet/lipgloss" "os" "reflect" "runtime/debug" "strings" ) var ( Stderr = os.Stderr Stdout = os.Stdout StyleErr = style.New(func() lipgloss.Style { return lipgloss.NewStyle().Foreground(lipgloss.Color("1")) }) StyleWarn = style.New(func() lipgloss.Style { return lipgloss.NewStyle().Foreground(lipgloss.Color("3")) }) ) type empty struct{} const PanicErrorCode = 8 var Print = func(format string, values ...any) (any, error) { return fmt.Fprintf(Stdout, format, values...) } var Warn = func(format string, values ...any) (any, error) { return fmt.Fprint(Stderr, StyleWarn.Render(fmt.Sprintf(format, values...))) } var Panic = func(code *ExitCode, format string, values ...any) (any, error) { pkg := reflect.TypeOf(empty{}).PkgPath() v, err := fmt.Fprint(Stderr, StyleErr.Render(fmt.Sprintf(format, values...))) st := strings.Split(string(debug.Stack()), "\n") for i, l := range st { if strings.Contains(l, pkg) { st = st[i:] break } } _, _ = Warn("%s\n", strings.Join(st, "\n")) os.Exit(PanicErrorCode) return v, err }