#![forbid(unsafe_code)]
use anyhow::Result;
use clap::Parser;
use secretenv_core::Config;
use tracing_subscriber::layer::SubscriberExt as _;
use tracing_subscriber::util::SubscriberInitExt as _;
use tracing_subscriber::EnvFilter;
use secretenv_backends_init as backends_init;
mod cli;
mod doctor;
mod invite;
mod profile;
mod reports;
mod setup;
use cli::Cli;
#[tokio::main]
async fn main() -> Result<()> {
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("secretenv=warn"));
let _telemetry = secretenv_telemetry::init()?;
tracing_subscriber::registry()
.with(env_filter)
.with(tracing_subscriber::fmt::layer().with_writer(std::io::stderr).without_time())
.with(secretenv_telemetry::tracing_bridge_layer())
.init();
let cli = Cli::parse();
let allow_missing = matches!(cli.command, cli::Command::Setup(_));
let config = load_config(&cli, allow_missing)?;
let backends = if matches!(cli.command, cli::Command::Mcp(_)) {
secretenv_core::BackendRegistry::new()
} else {
backends_init::build_registry(&config)?
};
cli.run(&config, &backends).await
}
fn load_config(cli: &Cli, allow_missing: bool) -> Result<Config> {
match &cli.config {
Some(path) if allow_missing && !path.exists() => Ok(Config::default()),
Some(path) => Config::load_from(path),
None => Config::load(),
}
}