aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/lulu/vi.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/lulu/vi.go')
-rw-r--r--cmd/lulu/vi.go67
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
+}