diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index 2c10c3a..db5e80a 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -150,24 +150,50 @@ func main() { }, ) - c.NewCommand( - "cure", - "Cure the named artifact and show its path", - func(args []string) error { - if len(args) != 1 { - return errors.New("cure requires 1 argument") - } - if p, ok := rosa.ResolveName(args[0]); !ok { - return fmt.Errorf("unsupported artifact %q", args[0]) - } else { - pathname, _, err := cache.Cure(rosa.Std.Load(p)) - if err == nil { - log.Println(pathname) + { + var ( + flagDump string + ) + c.NewCommand( + "cure", + "Cure the named artifact and show its path", + func(args []string) error { + if len(args) != 1 { + return errors.New("cure requires 1 argument") } - return err - } - }, - ) + if p, ok := rosa.ResolveName(args[0]); !ok { + return fmt.Errorf("unsupported artifact %q", args[0]) + } else if flagDump == "" { + pathname, _, err := cache.Cure(rosa.Std.Load(p)) + if err == nil { + log.Println(pathname) + } + return err + } else { + f, err := os.OpenFile( + flagDump, + os.O_WRONLY|os.O_CREATE|os.O_EXCL, + 0644, + ) + if err != nil { + return err + } + + if err = cache.EncodeAll(f, rosa.Std.Load(p)); err != nil { + _ = f.Close() + return err + } + + return f.Close() + } + }, + ). + Flag( + &flagDump, + "dump", command.StringFlag(""), + "Write IR to specified pathname and terminate", + ) + } c.MustParse(os.Args[1:], func(err error) { if cache != nil {