use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(
name = "agentswap",
version,
about = "AgentSwap CLI — AI-agent-optimized DEX aggregator"
)]
pub struct Cli {
#[arg(short, long, global = true)]
pub json: bool,
#[arg(
short,
long,
global = true,
env = "AGENTSWAP_URL",
default_value = "https://api.agentswap.co"
)]
pub url: String,
#[arg(short = 'k', long, global = true, env = "SR_API_KEY")]
pub api_key: Option<String>,
#[arg(long, global = true, env = "AGENTSWAP_KEY_FILE")]
pub key_file: Option<String>,
#[arg(long, global = true, env = "AGENTSWAP_X402")]
pub x402: bool,
#[arg(long, global = true)]
pub prefer_x402: bool,
#[arg(long, global = true, env = "AGENTSWAP_X402_KEY_FILE")]
pub x402_key_file: Option<String>,
#[arg(long, global = true, env = "AGENTSWAP_X402_CHAIN", default_value_t = 8453)]
pub x402_chain: u64,
#[arg(long, global = true, env = "AGENTSWAP_X402_MAX_AMOUNT", default_value = "0")]
pub x402_max_amount: String,
#[arg(long, global = true, env = "AGENTSWAP_X402_ASSET", default_value = "USDC")]
pub x402_asset: String,
#[arg(long, global = true, env = "AGENTSWAP_GATEWAY_URL")]
pub gateway_url: Option<String>,
#[arg(long, global = true)]
pub allow_trade: bool,
#[arg(long = "max-amount", global = true, env = "AGENTSWAP_TRADE_MAX_AMOUNT")]
pub trade_max_amount: Option<String>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
BatchQuote {
#[arg(short, long)]
chain: String,
#[arg(required = true)]
pairs: Vec<String>,
#[arg(short, long)]
amount: String,
},
Chains,
BuyQuota {
#[arg(short, long)]
chain: String,
#[arg(short, long)]
token: String,
#[arg(short, long)]
amount: String,
},
Quote {
#[arg(short, long)]
chain: String,
#[arg(short, long)]
from: String,
#[arg(short, long)]
to: String,
#[arg(short, long)]
amount: String,
#[arg(short, long)]
slippage: Option<u16>,
#[arg(long)]
verify: bool,
},
Health,
KeyInfo,
Tokens {
#[arg(short, long)]
chain: Option<String>,
},
Pools {
#[arg(short, long)]
chain: String,
#[arg(short, long)]
address: String,
},
Register {
#[arg(long)]
address: String,
#[arg(long)]
private_key: Option<String>,
#[arg(long)]
key_file: Option<String>,
},
Pricing,
QuotaClaim {
#[arg(short, long)]
chain: String,
#[arg(long)]
tx_hash: String,
},
RouteExplain {
#[arg(long)]
hash: String,
},
Mcp,
Intent {
#[command(subcommand)]
command: IntentCommands,
},
Policy {
#[arg(short, long)]
chain: String,
#[arg(long)]
owner: String,
#[arg(long)]
agent: String,
#[arg(long)]
lookback_blocks: Option<u64>,
#[arg(long = "token")]
tokens: Vec<String>,
},
Trade {
#[arg(short, long)]
chain: String,
#[arg(short, long)]
from: String,
#[arg(short, long)]
to: String,
#[arg(short, long)]
amount: String,
#[arg(short, long)]
slippage: Option<u16>,
#[arg(long)]
min_out: Option<String>,
#[arg(long, default_value = "agent-order")]
mode: String,
#[arg(long, env = "AGENTSWAP_PROXY")]
proxy: String,
#[arg(long)]
nonce: Option<String>,
#[arg(long, default_value_t = 120)]
deadline_secs: u64,
#[arg(long)]
dry_run: bool,
#[arg(long)]
relay: bool,
#[arg(long)]
self_submit: bool,
#[arg(long)]
key_file: Option<String>,
},
}
#[derive(Subcommand)]
pub enum IntentCommands {
Place {
#[arg(short, long)]
chain: String,
#[arg(long)]
proxy_owner: String,
#[arg(short, long)]
from: String,
#[arg(short, long)]
to: String,
#[arg(short, long)]
amount: String,
#[arg(long)]
start_out: String,
#[arg(long)]
end_out: String,
#[arg(long)]
decay_secs: Option<u64>,
#[arg(long)]
duration_secs: Option<u64>,
#[arg(long)]
deadline_secs: Option<u64>,
#[arg(long)]
relay: bool,
#[arg(long)]
self_submit: bool,
#[arg(long)]
dry_run: bool,
},
List {
#[arg(short, long)]
chain: String,
#[arg(long, conflicts_with = "agent", required_unless_present = "agent")]
owner: Option<String>,
#[arg(long, conflicts_with = "owner", required_unless_present = "owner")]
agent: Option<String>,
#[arg(long)]
lookback_blocks: Option<u64>,
},
Status {
#[arg(short, long)]
chain: String,
#[arg(long)]
id: String,
#[arg(long)]
lookback_blocks: Option<u64>,
},
}