utils/internal/cli/convids/app.go

60 lines
1.3 KiB
Go

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
}