From ac5275353c0d0f33ebe47c3e177d0b35b7bd6581 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Tue, 10 Aug 2021 13:07:14 -0600 Subject: [PATCH] implement publish sub-cmd of mailinglist-cli --- srv/cfg/cfg.go | 26 +++++++++++++++++++++++++- srv/cmd/mailinglist-cli/main.go | 30 ++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/srv/cfg/cfg.go b/srv/cfg/cfg.go index 08a9e53..685248c 100644 --- a/srv/cfg/cfg.go +++ b/srv/cfg/cfg.go @@ -19,12 +19,14 @@ type Cfg struct { *flag.FlagSet hooks []func(ctx context.Context) error + args []string } // New initializes and returns a new instance of *Cfg. func New() *Cfg { return &Cfg{ FlagSet: flag.NewFlagSet("", flag.ExitOnError), + args: os.Args[1:], } } @@ -38,7 +40,7 @@ func (c *Cfg) OnInit(cb func(context.Context) error) { // called. If one returns an error that error is returned and no further hooks // are run. func (c *Cfg) Init(ctx context.Context) error { - if err := c.FlagSet.Parse(os.Args[1:]); err != nil { + if err := c.FlagSet.Parse(c.args); err != nil { return err } @@ -50,3 +52,25 @@ func (c *Cfg) Init(ctx context.Context) error { return nil } + +// SubCmd should be called _after_ Init. Init will have consumed all arguments +// up until the first non-flag argument. This non-flag argument is a +// sub-command, and is returned by this method. This method also resets Cfg's +// internal state so that new options can be added to it. +// +// If there is no sub-command following the initial set of flags then this will +// return empty string. +func (c *Cfg) SubCmd() string { + c.args = c.FlagSet.Args() + if len(c.args) == 0 { + return "" + } + + subCmd := c.args[0] + + c.FlagSet = flag.NewFlagSet(subCmd, flag.ExitOnError) + c.hooks = nil + c.args = c.args[1:] + + return subCmd +} diff --git a/srv/cmd/mailinglist-cli/main.go b/srv/cmd/mailinglist-cli/main.go index ca4ccd6..4ae47fe 100644 --- a/srv/cmd/mailinglist-cli/main.go +++ b/srv/cmd/mailinglist-cli/main.go @@ -68,14 +68,10 @@ func main() { ml := mailinglist.New(mlParams) _ = ml - args := cfg.Args() - if len(args) == 0 { - args = append(args, "") - } - - action, args := args[0], args[1:] + subCmd := cfg.SubCmd() + ctx = mctx.Annotate(ctx, "subCmd", subCmd) - switch action { + switch subCmd { case "list": for it := mlStore.GetAll(); ; { email, err := it() @@ -94,7 +90,25 @@ func main() { logger.Info(ctx, "next") } + case "publish": + + title := cfg.String("title", "", "Title of the post which was published") + url := cfg.String("url", "", "URL of the post which was published") + cfg.Init(ctx) + + if *title == "" { + logger.Fatal(ctx, "-title is required") + + } else if *url == "" { + logger.Fatal(ctx, "-url is required") + } + + err := ml.Publish(*title, *url) + if err != nil { + loggerFatalErr(ctx, logger, "publishing", err) + } + default: - logger.Fatal(ctx, "invalid action") + logger.Fatal(ctx, "invalid sub-command, must be list|publish") } }