diff --git a/cmd/convids/main.go b/cmd/convids/main.go index caaf276..802bd0a 100644 --- a/cmd/convids/main.go +++ b/cmd/convids/main.go @@ -4,58 +4,21 @@ import ( "fmt" "os" - "codeberg.org/danjones000/utils/chill" c "codeberg.org/danjones000/utils/cli/context" e "codeberg.org/danjones000/utils/cli/err" - "codeberg.org/danjones000/utils/cli/spin" - "codeberg.org/danjones000/utils/convids" ccli "codeberg.org/danjones000/utils/internal/cli/convids" ) const dataPath = "shows.yml" func main() { - flags, err := ccli.ParseFlags(os.Args[0], os.Args[1:]) - e.HandleErr(err) - if *ccli.Help { - flags.Usage() - } - ctx, done := c.SelfCancelingContextFromBackground() defer done() - var walker convids.ShowWalker - if *ccli.DryRun { - walker = convids.DryRun(os.Stdout) - } else { - gs := convids.GetShow(ctx) - - walker = func(s *convids.Show, path string) error { - ct := chill.Chill(ctx) - msg := fmt.Sprintf("Waiting for CPU to cool, for %s", path) - sp := spin.Spin(ct, msg) - err := sp.Wait() - if err != nil { - return err - } - return gs(s, path) - } - } - - data, err := convids.NewData(dataPath) + app, err := ccli.NewApp(ctx, os.Args[0], os.Args[1:], dataPath, os.Stdout, os.Stdin, os.Stderr) e.HandleErr(err) - groupPrinter := convids.PrintGroupName(os.Stdout) - - if *ccli.Loop { - fmt.Println("looping") - for err == nil { - err = convids.WalkFiles(data, false, groupPrinter, walker) - fmt.Println(err) - } - } else { - err = convids.WalkFiles(data, false, groupPrinter, walker) - } + err = app.Run(ctx) e.HandleErr(err) fmt.Println("Done!") diff --git a/convids/logic.go b/convids/logic.go index bcd41b8..6d90c2b 100644 --- a/convids/logic.go +++ b/convids/logic.go @@ -162,13 +162,18 @@ func DryRun(out io.Writer) ShowWalker { } func GetShow(ctx context.Context) ShowWalker { + return GetShowWithIO(ctx, os.Stdin, os.Stdout, os.Stderr) +} + +func GetShowWithIO(ctx context.Context, stdin io.Reader, stdout io.Writer, stderr io.Writer) ShowWalker { return func(s *Show, path string) error { cmd := exec.CommandContext(ctx, "get-shows", s.Folder, path) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + cmd.Stdin = stdin + cmd.Stdout = stdout + cmd.Stderr = stderr return cmd.Run() } + } func PrintGroupName(out io.Writer) GroupPrinter { diff --git a/internal/cli/convids/app.go b/internal/cli/convids/app.go new file mode 100644 index 0000000..6bd349b --- /dev/null +++ b/internal/cli/convids/app.go @@ -0,0 +1,60 @@ +package convids + +import ( + "context" + "fmt" + "io" + + conutils "codeberg.org/danjones000/utils/convids" + "github.com/spf13/pflag" +) + +type App struct { + Name string + Data *conutils.Data + flags *pflag.FlagSet + stdout io.Writer + stderr io.Writer + stdin io.Reader + walker conutils.ShowWalker + groupPrinter conutils.GroupPrinter +} + +func NewApp(ctx context.Context, name string, args []string, dataPath string, stdout io.Writer, stdin io.Reader, stderr io.Writer) (*App, error) { + a := App{Name: name, stdout: stdout, stdin: stdin, stderr: stderr} + var err error + a.flags, err = ParseFlags(name, args) + if err != nil { + return nil, err + } + + a.walker = GetWalker(ctx, *DryRun, stdin, stdout, stderr) + a.Data, err = conutils.NewData(dataPath) + if err != nil { + return nil, err + } + a.groupPrinter = conutils.PrintGroupName(stdout) + + return &a, nil +} + +func (a *App) Run(ctx context.Context) error { + if *Loop { + return a.runInLoop(ctx) + } + return a.run(ctx) +} + +func (a *App) run(ctx context.Context) error { + return conutils.WalkFiles(a.Data, false, a.groupPrinter, a.walker) +} + +func (a *App) runInLoop(ctx context.Context) error { + fmt.Fprintln(a.stdout, "Looping") + var err error + for err == nil { + err = a.run(ctx) + fmt.Fprintln(a.stdout, err) + } + return err +} diff --git a/internal/cli/convids/walker.go b/internal/cli/convids/walker.go new file mode 100644 index 0000000..a7dc85c --- /dev/null +++ b/internal/cli/convids/walker.go @@ -0,0 +1,29 @@ +package convids + +import ( + "context" + "fmt" + "io" + + "codeberg.org/danjones000/utils/chill" + "codeberg.org/danjones000/utils/cli/spin" + conutils "codeberg.org/danjones000/utils/convids" +) + +func GetWalker(ctx context.Context, dryRun bool, in io.Reader, out, errOut io.Writer) conutils.ShowWalker { + if dryRun { + return conutils.DryRun(out) + } + + gs := conutils.GetShowWithIO(ctx, in, out, errOut) + return func(s *conutils.Show, path string) error { + ct := chill.Chill(ctx) + msg := fmt.Sprintf("Waiting for CPU to cool, for %s", path) + sp := spin.Spin(ct, msg) + err := sp.Wait() + if err != nil { + return err + } + return gs(s, path) + } +}