diff options
Diffstat (limited to 'cmd/lulu/vi.go')
| -rw-r--r-- | cmd/lulu/vi.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/cmd/lulu/vi.go b/cmd/lulu/vi.go new file mode 100644 index 0000000..27e26ab --- /dev/null +++ b/cmd/lulu/vi.go @@ -0,0 +1,67 @@ +package main + +import ( + "context" + "fmt" + "net/url" + "time" + + "github.com/alecthomas/kong" + + "git.samanthony.xyz/lulu" +) + +type ValidateInteriorCmd struct { + Basic ValidateInteriorBasicCmd `cmd help:"Basic validation"` + Full ValidateInteriorFullCmd `cmd default:"withargs" help:"Extended validation (default)"` + Timeout time.Duration `short:"t" default:"${default_timeout}"` +} + +func (cmd ValidateInteriorCmd) AfterApply(ctx *kong.Context) error { + ctx.Bind(cmd.Timeout) + return nil +} + +type ValidateInteriorBasicCmd struct { + Url *url.URL `arg help:"Location of interior file"` +} + +func (cmd ValidateInteriorBasicCmd) Run(cli *kong.Kong, clnt *lulu.Client, timeout time.Duration) error { + return validateInterior(cli, clnt, timeout, func(ctx context.Context) (lulu.InteriorValidation, error) { + return clnt.ValidateInteriorBasic(ctx, cmd.Url.String()) + }, lulu.InteriorStatusValidated) +} + +type ValidateInteriorFullCmd struct { + Url *url.URL `arg help:"Location of interior file"` + Mfg lulu.PkgId `arg help:"${mfg_help}"` +} + +func (cmd ValidateInteriorFullCmd) Run(cli *kong.Kong, clnt *lulu.Client, timeout time.Duration) error { + return validateInterior(cli, clnt, timeout, func(ctx context.Context) (lulu.InteriorValidation, error) { + return clnt.ValidateInterior(ctx, cmd.Url.String(), cmd.Mfg) + }, lulu.InteriorStatusNormalized) +} + +func validateInterior(cli *kong.Kong, clnt *lulu.Client, timeout time.Duration, validate func(ctx context.Context) (lulu.InteriorValidation, error), wantStatus lulu.InteriorValidationStatus) error { + ctx, cancel := context.WithTimeout(clnt.Context(), timeout) + defer cancel() + val, err := validate(ctx) + if err != nil { + return err + } + fmt.Println("status:", val.Status) + fmt.Println("id:", val.Id) + if len(val.ValidPkgIds) > 0 { + fmt.Printf("valid %ss: %v\n", typeName(val.ValidPkgIds[0]), val.ValidPkgIds) + } + if len(val.Errors) > 0 { + for _, err := range val.Errors { + cli.Errorf("%v\n", err) + } + return fmt.Errorf("response contains errors") + } else if val.Status != wantStatus { + return fmt.Errorf("bad status %q; expected %q\n", val.Status, wantStatus) + } + return nil +} |