use anyhow::Result;
use clap::Parser;
use codex_mobile_bridge::config::Config;
use codex_mobile_bridge::manage::{ManageCli, run as run_manage};
use codex_mobile_bridge::server::build_router;
use codex_mobile_bridge::state::BridgeState;
use std::ffi::OsString;
use std::sync::Arc;
use tokio::net::TcpListener;
use tracing_subscriber::EnvFilter;
#[tokio::main]
async fn main() -> Result<()> {
let raw_args: Vec<OsString> = std::env::args_os().collect();
if raw_args.get(1).and_then(|value| value.to_str()) == Some("manage") {
let manage_args = std::iter::once(OsString::from("codex-mobile-bridge"))
.chain(raw_args.into_iter().skip(2))
.collect::<Vec<_>>();
return run_manage(ManageCli::parse_from(manage_args));
}
init_tracing();
let config = Config::parse_from(raw_args).validated()?;
let state = BridgeState::bootstrap(config.clone()).await?;
let router = build_router(Arc::clone(&state));
let listener = TcpListener::bind(&config.listen_addr).await?;
tracing::info!("codex-mobile bridge listening on {}", config.listen_addr);
axum::serve(listener, router).await?;
Ok(())
}
fn init_tracing() {
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("codex_mobile_bridge=info,tower_http=info"));
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_target(false)
.compact()
.init();
}