package main import ( "errors" "fmt" "io" "os" "strings" "unique" "hakurei.app/internal/pkg" "hakurei.app/internal/rosa" ) // commandInfo implements the info subcommand. func commandInfo( cm *cache, args []string, w io.Writer, writeStatus bool, r *rosa.Report, ) (err error) { if len(args) == 0 { return errors.New("info requires at least 1 argument") } // recovered by HandleAccess mustPrintln := func(a ...any) { if _, _err := fmt.Fprintln(w, a...); _err != nil { panic(_err) } } mustPrint := func(a ...any) { if _, _err := fmt.Fprint(w, a...); _err != nil { panic(_err) } } for i, name := range args { handle := rosa.ArtifactH(unique.Make(name)) if meta := rosa.Native().Get(handle); meta == nil { return fmt.Errorf("unknown artifact %q", name) } else { var suffix string a, version := rosa.Native().MustLoad(rosa.Std, handle) if version != rosa.Unversioned { suffix += "-" + version } mustPrintln("name : " + name + suffix) mustPrintln("description : " + meta.Description) if meta.Website != "" { mustPrintln("website : " + strings.TrimSuffix(meta.Website, "/")) } if len(meta.Dependencies) > 0 { mustPrint("depends on :") for _, d := range meta.Dependencies { s := rosa.Native().MustGet(d).Name if _, _version := rosa.Native().Load(rosa.Std, d); _version != rosa.Unversioned { s += "-" + _version } mustPrint(" " + s) } mustPrintln() } const statusPrefix = "status : " if writeStatus { if r == nil { var f io.ReadSeekCloser err = cm.Do(func(cache *pkg.Cache) (err error) { f, err = cache.OpenStatus(a) return }) if err != nil { if errors.Is(err, os.ErrNotExist) { mustPrintln( statusPrefix + "not yet cured", ) } else { return } } else { mustPrint(statusPrefix) _, err = io.Copy(w, f) if err = errors.Join(err, f.Close()); err != nil { return } } } else if err = cm.Do(func(cache *pkg.Cache) (err error) { status, n := r.ArtifactOf(cache.Ident(a)) if status == nil { mustPrintln( statusPrefix + "not in report", ) } else { mustPrintln("size :", n) mustPrint(statusPrefix) if _, err = w.Write(status); err != nil { return } } return }); err != nil { return } } if i != len(args)-1 { mustPrintln() } } } return nil }