use std::path::PathBuf;
use clap::{Args, Parser, ValueEnum};
use ferridriver::backend::BackendKind;
use ferridriver::state::ConnectMode;
#[derive(Parser)]
#[command(
name = "ferridriver",
about = "High-performance browser automation -- MCP server",
version,
propagate_version = true
)]
pub struct Cli {
#[arg(short, long, action = clap::ArgAction::Count, global = true)]
pub verbose: u8,
#[arg(short, long, global = true)]
pub config: Option<PathBuf>,
#[command(flatten)]
pub browser: BrowserArgs,
#[command(flatten)]
pub transport: TransportArgs,
}
#[derive(Args)]
pub struct BrowserArgs {
#[arg(long, default_value = "cdp-pipe")]
pub backend: Backend,
#[arg(long)]
pub headless: bool,
#[arg(long)]
pub executable_path: Option<String>,
#[arg(long)]
pub connect: Option<String>,
#[arg(long)]
pub auto_connect: Option<String>,
#[arg(long)]
pub user_data_dir: Option<String>,
}
impl BrowserArgs {
pub fn backend_kind(&self) -> BackendKind {
backend_to_kind(&self.backend)
}
pub fn connect_mode(&self) -> ConnectMode {
resolve_connect_mode(self)
}
}
#[derive(Args)]
pub struct TransportArgs {
#[arg(long, default_value = "stdio")]
pub transport: Transport,
#[arg(long, default_value = "8080")]
pub port: u16,
}
#[derive(Clone, ValueEnum)]
pub enum Backend {
CdpPipe,
CdpRaw,
#[cfg(target_os = "macos")]
Webkit,
Bidi,
}
#[derive(Clone, ValueEnum)]
pub enum Transport {
Stdio,
Http,
}
pub fn backend_to_kind(b: &Backend) -> BackendKind {
match b {
Backend::CdpPipe => BackendKind::CdpPipe,
Backend::CdpRaw => BackendKind::CdpRaw,
#[cfg(target_os = "macos")]
Backend::Webkit => BackendKind::WebKit,
Backend::Bidi => BackendKind::Bidi,
}
}
pub fn resolve_connect_mode(args: &BrowserArgs) -> ConnectMode {
if let Some(ref url) = args.connect {
ConnectMode::ConnectUrl(url.clone())
} else if let Some(ref channel) = args.auto_connect {
ConnectMode::AutoConnect {
channel: channel.clone(),
user_data_dir: args.user_data_dir.clone(),
}
} else {
ConnectMode::Launch
}
}