use std::net::SocketAddr;
use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "earl",
version,
about = "AI-safe CLI for executing provider commands"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Call(CallArgs),
Templates(TemplateArgs),
Secrets(SecretsArgs),
Auth(AuthArgs),
Mcp(McpArgs),
Doctor(DoctorArgs),
Web(WebArgs),
Completion(CompletionArgs),
}
#[derive(Debug, Args)]
pub struct CallArgs {
pub command: String,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub args: Vec<String>,
#[arg(long)]
pub yes: bool,
#[arg(long)]
pub json: bool,
#[arg(long)]
pub env: Option<String>,
}
#[derive(Debug, Args)]
pub struct TemplateArgs {
#[arg(long, global = true)]
pub json: bool,
#[command(subcommand)]
pub command: TemplateSubcommand,
}
#[derive(Debug, Subcommand)]
pub enum TemplateSubcommand {
List(TemplateListArgs),
Search(TemplateSearchArgs),
Validate,
Import(TemplateImportArgs),
Generate(TemplateGenerateArgs),
}
#[derive(Debug, Args)]
pub struct TemplateListArgs {
#[arg(long)]
pub category: Option<String>,
#[arg(long)]
pub mode: Option<TemplateMode>,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum TemplateMode {
#[value(name = "read")]
Read,
#[value(name = "write")]
Write,
}
#[derive(Debug, Args)]
pub struct TemplateSearchArgs {
pub query: String,
#[arg(long, default_value_t = 10)]
pub limit: usize,
}
#[derive(Debug, Args)]
pub struct TemplateImportArgs {
pub source_ref: String,
#[arg(long, value_enum, default_value_t = TemplateImportScope::Local)]
pub scope: TemplateImportScope,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum TemplateImportScope {
#[value(name = "local")]
Local,
#[value(name = "global")]
Global,
}
#[derive(Debug, Args)]
pub struct TemplateGenerateArgs {
#[arg(
required = true,
num_args = 1..,
trailing_var_arg = true,
allow_hyphen_values = true
)]
pub command: Vec<String>,
}
#[derive(Debug, Args)]
pub struct SecretsArgs {
#[command(subcommand)]
pub command: SecretsSubcommand,
}
#[derive(Debug, Subcommand)]
pub enum SecretsSubcommand {
Set(SecretSetArgs),
Get(SecretGetArgs),
List,
Delete(SecretDeleteArgs),
}
#[derive(Debug, Args)]
pub struct SecretSetArgs {
pub key: String,
#[arg(long)]
pub stdin: bool,
}
#[derive(Debug, Args)]
pub struct SecretGetArgs {
pub key: String,
}
#[derive(Debug, Args)]
pub struct SecretDeleteArgs {
pub key: String,
}
#[derive(Debug, Args)]
pub struct AuthArgs {
#[command(subcommand)]
pub command: AuthSubcommand,
}
#[derive(Debug, Subcommand)]
pub enum AuthSubcommand {
Login(AuthProfileArgs),
Status(AuthProfileArgs),
Refresh(AuthProfileArgs),
Logout(AuthProfileArgs),
}
#[derive(Debug, Args)]
pub struct AuthProfileArgs {
pub profile: String,
}
#[derive(Debug, Args)]
pub struct McpArgs {
#[arg(value_enum, default_value_t = McpTransport::Stdio)]
pub transport: McpTransport,
#[arg(long, default_value = "127.0.0.1:8977")]
pub listen: SocketAddr,
#[arg(long, value_enum, default_value_t = McpMode::Full)]
pub mode: McpMode,
#[arg(long)]
pub yes: bool,
#[arg(long)]
pub allow_unauthenticated: bool,
}
#[derive(Debug, Args)]
pub struct DoctorArgs {
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub struct WebArgs {
#[arg(long, default_value = "127.0.0.1:0")]
pub listen: SocketAddr,
#[arg(long)]
pub no_open: bool,
}
#[derive(Debug, Args)]
pub struct CompletionArgs {
#[arg(value_enum)]
pub shell: CompletionShell,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum CompletionShell {
#[value(name = "bash")]
Bash,
#[value(name = "zsh")]
Zsh,
#[value(name = "fish")]
Fish,
#[value(name = "powershell")]
PowerShell,
#[value(name = "elvish")]
Elvish,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum McpTransport {
#[value(name = "stdio")]
Stdio,
#[value(name = "http")]
Http,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum McpMode {
#[value(name = "full")]
Full,
#[value(name = "discovery")]
Discovery,
}