// Info is defined on the cmd.Command interface.
969153
func (c *ReloadCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "reload-spaces",
		Purpose: "Reloads spaces and subnets from substrate.",
		Doc:     strings.TrimSpace(ReloadCommandDoc),
	})
}
203488
func (c *commitCommand) Info() *cmd.Info {
	info := &cmd.Info{
		Name:    "commit",
		Args:    "<branch name>",
		Purpose: commitSummary,
		Doc:     commitDoc,
	}
	return jujucmd.Info(info)
}
787877
func (c *uploadCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "upload-backup",
		Args:    "<filename>",
		Purpose: "Store a backup archive file remotely in Juju.",
		Doc:     uploadDoc,
	})
}
443036
func (c *consumeCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "consume",
		Args:    "<remote offer path> [<local application name>]",
		Purpose: usageConsumeSummary,
		Doc:     usageConsumeDetails,
	})
}
495917
func (c *showCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "show-offer",
		Args:    "[<controller>:]<offer url>",
		Purpose: "Shows extended information about the offered application.",
		Doc:     showCommandDoc,
	})
}
312656
func (c *disableCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "disable-user",
		Args:    "<user name>",
		Purpose: usageDisableUserSummary,
		Doc:     usageDisableUserDetails,
	})
}
666975
func info(command interface{}) (*CommandInfo, error) {
	typeof := reflect.TypeOf(command)

	// Going up the pointer chain to find the underlying struct
	for typeof.Kind() == reflect.Ptr {
		typeof = typeof.Elem()
	}

	field, ok := typeof.FieldByName("_")
	if !ok {
		return nil, fmt.Errorf(`missing meta ("_") field in %#v`, command)
	}

	name, nameOk := field.Tag.Lookup("name")
	description, _ := field.Tag.Lookup("description")

	if !nameOk {
		return nil, fmt.Errorf(`missing "name" key in the tag string of %#v`, command)
	}

	info := &CommandInfo{
		Name:        name,
		Description: description,
	}

	return info, nil
}
571627
func (c *agreeCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "agree",
		Args:    "<term>",
		Purpose: "Agree to terms.",
		Doc:     agreeDoc,
	})
}
525976
func (c *downloadCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "download-backup",
		Args:    "<ID>",
		Purpose: "Get an archive file.",
		Doc:     downloadDoc,
	})
}
224661
func (c *addImageMetadataCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "add-image",
		Purpose: "adds image metadata to model",
		Doc:     addImageCommandDoc,
	})
}
353321
func (c *enableDestroyController) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "enable-destroy-controller",
		Purpose: "Enable destroy-controller by removing disabled commands in the controller.",
		Doc:     enableDestroyDoc,
	})
}
934967
func (c *restoreCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "restore-backup",
		Purpose: "Restore from a backup archive to the existing controller.",
		Args:    "",
		Doc:     strings.TrimSpace(restoreDoc),
	})
}
1065152
func (c *deleteImageMetadataCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "delete-image",
		Purpose: "deletes image metadata from environment",
		Doc:     deleteImageCommandDoc,
	})
}
650962
func (c *modelsCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "models",
		Purpose: "Lists models a user can access on a controller.",
		Doc:     listModelsDoc,
		Aliases: []string{"list-models"},
	})
}
899983
func (c *importFilesystemCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "import-filesystem",
		Purpose: "Imports a filesystem into the model.",
		Doc:     importFilesystemCommandDoc,
		Args:    importFilesystemCommandAgs,
	})
}
1213464
func (c *listCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "users",
		Purpose: usageListUsersSummary,
		Doc:     usageListUsersDetails,
		Aliases: []string{"list-users"},
	})
}
1097857
func (c *grantCommand) Info() *cmd.Info {
	return jujucmd.Info(&cmd.Info{
		Name:    "grant",
		Args:    "<user name> <permission> [<model name> ... | <offer url> ...]",
		Purpose: usageGrantSummary,
		Doc:     usageGrantDetails,
	})
}