use std::path::PathBuf;
use anyhow::Result;
use clap::Parser;
use crate::browser::bridge::{DEFAULT_CONTROL_PORT, DEFAULT_WS_PORT};
use crate::browser::BridgeConfig;
use crate::daemon::server;
use crate::daemon::{self, paths, DaemonRunConfig};
#[derive(Parser, Clone)]
pub struct RunCommand {
#[arg(long, value_name = "PATH")]
pub socket: Option<PathBuf>,
#[arg(long, default_value_t = DEFAULT_WS_PORT)]
pub bridge_ws_port: u16,
#[arg(long, default_value_t = DEFAULT_CONTROL_PORT)]
pub bridge_control_port: u16,
#[arg(long, value_name = "URL[=URL]")]
pub bridge_allow_origin: Vec<String>,
#[arg(long, value_name = "PATH")]
pub bridge_token_file: Option<PathBuf>,
#[arg(long)]
pub no_menu: bool,
}
impl RunCommand {
pub async fn execute(self) -> Result<()> {
daemon::run_headless(self.into_run_config()?).await
}
pub fn into_run_config(self) -> Result<DaemonRunConfig> {
let socket_path = server::resolve_socket(self.socket)?;
let bridge_token_path = paths::token_path_for_socket(&socket_path);
let allow_origins = crate::browser::auth::OriginAllowlist::parse(&self.bridge_allow_origin)
.map_err(|e| anyhow::anyhow!("invalid --bridge-allow-origin: {e}"))?;
let bridge_config = BridgeConfig {
ws_port: self.bridge_ws_port,
control_port: self.bridge_control_port,
allow_origins,
..BridgeConfig::default()
};
Ok(DaemonRunConfig {
socket_path,
bridge_config,
bridge_token_file: self.bridge_token_file,
bridge_token_path,
})
}
}