Parcourir la source

Add support for multiple level CLI commands

E.g. "docker groups create" will attempt to call the function
CmdGroupsCreate

Signed-off-by: Ben Firshman <ben@firshman.co.uk>
Ben Firshman il y a 10 ans
Parent
commit
e1b968f198
2 fichiers modifiés avec 21 ajouts et 4 suppressions
  1. 14 4
      api/client/cli.go
  2. 7 0
      api/client/commands.go

+ 14 - 4
api/client/cli.go

@@ -35,11 +35,15 @@ var funcMap = template.FuncMap{
 	},
 }
 
-func (cli *DockerCli) getMethod(name string) (func(...string) error, bool) {
-	if len(name) == 0 {
-		return nil, false
+func (cli *DockerCli) getMethod(args ...string) (func(...string) error, bool) {
+	camelArgs := make([]string, len(args))
+	for i, s := range args {
+		if len(s) == 0 {
+			return nil, false
+		}
+		camelArgs[i] = strings.ToUpper(s[:1]) + strings.ToLower(s[1:])
 	}
-	methodName := "Cmd" + strings.ToUpper(name[:1]) + strings.ToLower(name[1:])
+	methodName := "Cmd" + strings.Join(camelArgs, "")
 	method := reflect.ValueOf(cli).MethodByName(methodName)
 	if !method.IsValid() {
 		return nil, false
@@ -49,6 +53,12 @@ func (cli *DockerCli) getMethod(name string) (func(...string) error, bool) {
 
 // Cmd executes the specified command
 func (cli *DockerCli) Cmd(args ...string) error {
+	if len(args) > 1 {
+		method, exists := cli.getMethod(args[:2]...)
+		if exists {
+			return method(args[2:]...)
+		}
+	}
 	if len(args) > 0 {
 		method, exists := cli.getMethod(args[0])
 		if !exists {

+ 7 - 0
api/client/commands.go

@@ -46,6 +46,13 @@ const (
 )
 
 func (cli *DockerCli) CmdHelp(args ...string) error {
+	if len(args) > 1 {
+		method, exists := cli.getMethod(args[:2]...)
+		if exists {
+			method("--help")
+			return nil
+		}
+	}
 	if len(args) > 0 {
 		method, exists := cli.getMethod(args[0])
 		if !exists {