github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/cmd/juju/charmcmd/sub.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charmcmd 5 6 import ( 7 "io" 8 9 "github.com/juju/cmd" 10 "github.com/juju/errors" 11 12 "github.com/juju/juju/charmstore" 13 ) 14 15 var registeredSubCommands []func(CharmstoreSpec) cmd.Command 16 17 // RegisterSubCommand adds the provided func to the set of those that 18 // will be called when the juju command runs. Each returned command will 19 // be registered with the identified "juju" sub-supercommand. 20 func RegisterSubCommand(newCommand func(CharmstoreSpec) cmd.Command) { 21 registeredSubCommands = append(registeredSubCommands, newCommand) 22 } 23 24 // NewCommandBase returns a new CommandBase. 25 func NewCommandBase(spec CharmstoreSpec) *CommandBase { 26 return &CommandBase{ 27 spec: newCharmstoreSpec(), 28 } 29 } 30 31 // CommandBase is the type that should be embedded in "juju charm" 32 // sub-commands. 33 type CommandBase struct { 34 // TODO(ericsnow) This should be a modelcmd.ModelCommandBase. 35 cmd.CommandBase 36 spec CharmstoreSpec 37 } 38 39 // Connect implements CommandBase. 40 func (c *CommandBase) Connect(ctx *cmd.Context) (charmstore.Client, io.Closer, error) { 41 if c.spec == nil { 42 return charmstore.Client{}, nil, errors.Errorf("missing charm store spec") 43 } 44 client, closer, err := c.spec.Connect(ctx) 45 if err != nil { 46 return charmstore.Client{}, nil, errors.Trace(err) 47 } 48 return client, closer, nil 49 }