diff options
| author | Jeff Carr <[email protected]> | 2025-10-21 15:48:24 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-21 15:48:24 -0500 |
| commit | 2b6414a664fd7ccc519874f4d0b55a12a871307c (patch) | |
| tree | b72eba5a53e98a219f4a54249241e2fd9b66e6d8 /exit.go | |
| parent | e9c3000abafd70702cb9db6e3738115012f498eb (diff) | |
housecleaning
Diffstat (limited to 'exit.go')
| -rw-r--r-- | exit.go | 83 |
1 files changed, 83 insertions, 0 deletions
@@ -0,0 +1,83 @@ +package argvpb + +import ( + "fmt" + "os" + "time" + + "go.wit.com/lib/cobol" + "go.wit.com/log" +) + +// since we know when the command starts (duh, this parses os.Args) +// this is a convienent way to provide a standard exit format back +// to the shell that also has built in timing! + +// also, it supports a custom Exit() back to your application + +func GoodExit(msg string) { + me.pb.GoodExit(msg) +} + +func BadExit(msg string, err error) { + me.pb.BadExit(msg, err) +} + +func (pb *Argv) GoodExit(msg string) { + go ExitWatchdog() + if me.appExit != nil { + me.appExit() + } + dur := time.Since(pb.Ctime.AsTime()) + log.Infof("%s: %s (%s)\n", pb.Argname, msg, cobol.FormatDuration(dur)) + os.Exit(0) +} + +func (pb *Argv) BadExit(msg string, err error) { + go ExitWatchdog() + if me.appExit != nil { + me.appExit() + } + // print out errors. this handles wrapped errors which is a useful + if err != nil { + if u, ok := err.(interface{ Unwrap() []error }); ok { + // If it does, call the method to get the slice of errors. + allerr := u.Unwrap() + for _, e := range allerr { + log.Info("Error:", e) + } + } else { + // If it's not a joined error, you can fall back to the single-unwrap loop. + log.Info("Error:", err) + } + } + + dur := time.Since(pb.Ctime.AsTime()) + log.Infof("%s error: %s (%s)\n", pb.Argname, msg, cobol.FormatDuration(dur)) + os.Exit(1) +} + +// this code doesn't need to be this complicated. I put it here as reference code for myself so I could remember where it is. +func ExitWatchdog() { + dog := time.NewTicker(5 * time.Second) + defer dog.Stop() + dogchan := make(chan bool) + /* + // this example would exit/destroy the ticker in 10 seconds + go func() { + time.Sleep(10 * time.Second) + done <- true + }() + */ + for { + select { + case <-dogchan: + fmt.Println("Done!") + return + case t := <-dog.C: + _ = t + log.Info("argv.Exit() watchdog: stalled in", me.pb.AppInfo.APPNAME+".Exit()") + // h.Scan() + } + } +} |
