diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2026-05-14 11:52:24 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2026-05-14 11:52:24 -0400 |
| commit | 71fc4ebe34a18de12d15cbdbaa09fb857b0e0229 (patch) | |
| tree | b04bae249b97ae2200043ac3f339fedf8cd7f18c | |
| parent | 26ec677a2bee8344675eb3b4afc24b3ae85f512a (diff) | |
| download | lulu-71fc4ebe34a18de12d15cbdbaa09fb857b0e0229.zip | |
cli: validate cover
| -rw-r--r-- | cmd/lulu/creds.go | 2 | ||||
| -rw-r--r-- | cmd/lulu/flag.go | 28 | ||||
| -rw-r--r-- | cmd/lulu/main.go | 2 | ||||
| -rw-r--r-- | cmd/lulu/validate_cover.go | 37 | ||||
| -rw-r--r-- | cmd/lulu/validate_interior.go | 18 |
5 files changed, 73 insertions, 14 deletions
diff --git a/cmd/lulu/creds.go b/cmd/lulu/creds.go index 5d80018..775c4da 100644 --- a/cmd/lulu/creds.go +++ b/cmd/lulu/creds.go @@ -18,7 +18,7 @@ var ( ) // Credentials contains the client-key and client-secret used to -// authenticate the client (us) to the API. +// authenticate to the API. type Credentials struct { key, secret string } diff --git a/cmd/lulu/flag.go b/cmd/lulu/flag.go index cd7773e..a981886 100644 --- a/cmd/lulu/flag.go +++ b/cmd/lulu/flag.go @@ -39,6 +39,11 @@ func (f Flag) MustBeSet(fs *flag.FlagSet) { } } +type boolFlag interface { + flag.Value + IsBoolFlag() bool +} + // boolValue implements flag.Value. type boolValue struct { p *bool @@ -48,7 +53,7 @@ func (bv boolValue) String() string { if bv.p != nil { return fmt.Sprint(*bv.p) } - return fmt.Sprint(false) + return "" } func (bv boolValue) Set(s string) error { @@ -62,9 +67,24 @@ func (bv boolValue) Set(s string) error { func (bv boolValue) IsBoolFlag() bool { return true } -type boolFlag interface { - flag.Value - IsBoolFlag() bool +type uintValue struct { + p *uint +} + +func (uv uintValue) String() string { + if uv.p != nil { + return fmt.Sprint(*uv.p) + } + return "" +} + +func (uv uintValue) Set(s string) error { + v, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return err + } + *uv.p = uint(v) + return nil } // textValue implements flag.Value for string types that implement diff --git a/cmd/lulu/main.go b/cmd/lulu/main.go index b664644..d86d418 100644 --- a/cmd/lulu/main.go +++ b/cmd/lulu/main.go @@ -42,7 +42,7 @@ func usage() { progName := os.Args[0] out := flag.CommandLine.Output() fmt.Fprintf(out, "Usage of %s:\n", progName) - fmt.Fprintf(out, "%s [global flags] [command] [command flags]\n", progName) + fmt.Fprintf(out, " %s [global flags] [command] [command flags]\n", progName) fmt.Fprintf(out, "Global Flags:\n") flag.PrintDefaults() fmt.Fprintf(out, "Commands:\n") diff --git a/cmd/lulu/validate_cover.go b/cmd/lulu/validate_cover.go index 25afbfd..dd16db7 100644 --- a/cmd/lulu/validate_cover.go +++ b/cmd/lulu/validate_cover.go @@ -1,9 +1,44 @@ package main import ( + "context" + "flag" + "fmt" + "net/url" + "time" + "git.samanthony.xyz/lulu" ) func validateCover(clnt *lulu.Client, args []string) { - lg.Fatal("not implemented") // TODO + var ( + url url.URL + mfg = newMfgFlagSet() + nPages uint + timeout time.Duration + ) + + urlFlag := Flag{urlValue{&url}, "url", "URL of cover file for Lulu to download"} + nPagesFlag := Flag{uintValue{&nPages}, "n", "Number of interior pages"} + + fs := flag.NewFlagSet("validate-cover", flag.ExitOnError) + urlFlag.AddTo(fs) + mfg.AddTo(fs) + nPagesFlag.AddTo(fs) + fs.DurationVar(&timeout, "t", defaultTimeout, "Timeout") + + if err := fs.Parse(args); err != nil { + lg.Fatalf("lulu: %v\n", err) + } + urlFlag.MustBeSet(fs) + mfg.MustBeSet(fs) + nPagesFlag.MustBeSet(fs) + + ctx, cancel := context.WithTimeout(clnt.Context(), timeout) + defer cancel() + val, err := clnt.ValidateCover(ctx, url.String(), mfg.PkgId(), nPages) + if err != nil { + lg.Fatal(err) + } + fmt.Println(val) // TODO: output format? } diff --git a/cmd/lulu/validate_interior.go b/cmd/lulu/validate_interior.go index f7c4bdb..d2b34bf 100644 --- a/cmd/lulu/validate_interior.go +++ b/cmd/lulu/validate_interior.go @@ -14,27 +14,31 @@ func validateInterior(clnt *lulu.Client, args []string) { var ( basic bool url url.URL + mfg = newMfgFlagSet() timeout time.Duration ) + basicFlag := Flag{boolValue{&basic}, "basic", "Basic validation without pod_package_id manufacturing options"} urlFlag := Flag{urlValue{&url}, "url", "URL of interior file for Lulu to download"} - mfgFlags := newMfgFlagSet() + fs := flag.NewFlagSet("validate-interior", flag.ExitOnError) basicFlag.AddTo(fs) urlFlag.AddTo(fs) - mfgFlags.AddTo(fs) + mfg.AddTo(fs) fs.DurationVar(&timeout, "t", defaultTimeout, "Timeout") + fs.Usage = func() { out := fs.Output() name := "validate-interior" fmt.Fprintf(out, "Usage of %s:\n", name) - fmt.Fprintf(out, " %s %s %s [flags]\n", name, urlFlag.Synopsis(), mfgFlags.Synopsis()) + fmt.Fprintf(out, " %s %s %s [flags]\n", name, urlFlag.Synopsis(), mfg.Synopsis()) fmt.Fprintf(out, " %s %s %s [flags]\n", name, basicFlag.Synopsis(), urlFlag.Synopsis()) fmt.Fprintf(out, "Flags:\n") fs.PrintDefaults() } + if err := fs.Parse(args); err != nil { - lg.Fatalf("lulu: %v", err) + lg.Fatalf("lulu: %v\n", err) } var val lulu.InteriorValidation @@ -43,14 +47,14 @@ func validateInterior(clnt *lulu.Client, args []string) { defer cancel() if basic { urlFlag.MustBeSet(fs) - for _, f := range mfgFlags.flags { + for _, f := range mfg.flags { mutexFlags(fs, f, basicFlag) } val, err = clnt.ValidateInteriorBasic(ctx, url.String()) } else { urlFlag.MustBeSet(fs) - mfgFlags.MustBeSet(fs) - val, err = clnt.ValidateInterior(ctx, url.String(), mfgFlags.PkgId()) + mfg.MustBeSet(fs) + val, err = clnt.ValidateInterior(ctx, url.String(), mfg.PkgId()) } if err != nil { lg.Fatal(err) |