syntax = "proto3";

package cosmos.autocli.v1;

import "cosmos_proto/cosmos.proto";

option go_package = "cosmossdk.io/api/cosmos/base/cli/v1;cliv1";

// ModuleOptions describes the CLI options for a Cosmos SDK module.
message ModuleOptions {
  // tx describes the tx commands for the module.
  ServiceCommandDescriptor tx = 1;

  // query describes the queries commands for the module.
  ServiceCommandDescriptor query = 2;
}

// ServiceCommandDescriptor describes a CLI command based on a protobuf service.
message ServiceCommandDescriptor {
  // service is the fully qualified name of the protobuf service to build
  // the command from. It can be left empty if sub_commands are used instead
  // which may be the case if a module provides multiple tx and/or query services.
  string service = 1;

  // rpc_command_options are options for commands generated from rpc methods.
  // If no options are specified for a given rpc method on the service, a
  // command will be generated for that method with the default options.
  repeated RpcCommandOptions rpc_command_options = 2;

  // sub_commands is a map of optional sub-commands for this command based on
  // different protobuf services. The map key is used as the name of the
  // sub-command.
  map<string, ServiceCommandDescriptor> sub_commands = 3;

  // enhance_custom_commands specifies whether to skip the service when generating commands, if a custom command already
  // exists, or enhance the existing command. If set to true, the custom command will be enhanced with the services from
  // gRPC. otherwise when a custom command exists, no commands will be generated for the service.
  bool enhance_custom_command = 4;

  // short is an optional parameter used to override the short description of the auto generated command.
  string short = 5;
}

// RpcCommandOptions specifies options for commands generated from protobuf
// rpc methods.
message RpcCommandOptions {
  // rpc_method is short name of the protobuf rpc method that this command is
  // generated from.
  string rpc_method = 1;

  // use is the one-line usage method. It also allows specifying an alternate
  // name for the command as the first word of the usage text.
  //
  // By default the name of an rpc command is the kebab-case short name of the
  // rpc method.
  string use = 2;

  // long is the long message shown in the 'help <this-command>' output.
  string long = 3;

  // short is the short description shown in the 'help' output.
  string short = 4;

  // example is examples of how to use the command.
  string example = 5;

  // alias is an array of aliases that can be used instead of the first word in Use.
  repeated string alias = 6;

  // suggest_for is an array of command names for which this command will be suggested -
  // similar to aliases but only suggests.
  repeated string suggest_for = 7;

  // deprecated defines, if this command is deprecated and should print this string when used.
  string deprecated = 8;

  // version defines the version for this command. If this value is non-empty and the command does not
  // define a "version" flag, a "version" boolean flag will be added to the command and, if specified,
  // will print content of the "Version" variable. A shorthand "v" flag will also be added if the
  // command does not define one.
  string version = 9;

  // flag_options are options for flags generated from rpc request fields.
  // By default all request fields are configured as flags. They can
  // also be configured as positional args instead using positional_args.
  map<string, FlagOptions> flag_options = 10;

  // positional_args specifies positional arguments for the command.
  repeated PositionalArgDescriptor positional_args = 11;

  // skip specifies whether to skip this rpc method when generating commands.
  bool skip = 12;

  // gov_proposal specifies whether autocli should generate a gov proposal transaction for this rpc method.
  // Normally autocli generates a transaction containing the message and broadcast it.
  // However, when true, autocli generates a proposal transaction containing the message and broadcast it.
  // This option is ineffective for query commands.
  bool gov_proposal = 13 [(cosmos_proto.field_added_in) = "client/v2 v2.0.0-beta.2"];
}

// FlagOptions are options for flags generated from rpc request fields.
// By default, all request fields are configured as flags based on the
// kebab-case name of the field. Fields can be turned into positional arguments
// instead by using RpcCommandOptions.positional_args.
message FlagOptions {
  // name is an alternate name to use for the field flag.
  string name = 1;

  // shorthand is a one-letter abbreviated flag.
  string shorthand = 2;

  // usage is the help message.
  string usage = 3;

  // default_value is the default value as text.
  string default_value = 4;

  // deprecated is the usage text to show if this flag is deprecated.
  string deprecated = 6;

  // shorthand_deprecated is the usage text to show if the shorthand of this flag is deprecated.
  string shorthand_deprecated = 7;

  // hidden hides the flag from help/usage text
  bool hidden = 8;
}

// PositionalArgDescriptor describes a positional argument.
message PositionalArgDescriptor {
  // proto_field specifies the proto field to use as the positional arg. Any
  // fields used as positional args will not have a flag generated.
  string proto_field = 1;

  // varargs makes a positional parameter a varargs parameter. This can only be
  // applied to last positional parameter and the proto_field must a repeated
  // field. Note: It is mutually exclusive with optional.
  bool varargs = 2;

  // optional makes the last positional parameter optional.
  // Note: It is mutually exclusive with varargs.
  bool optional = 3;
}
