use std::net::SocketAddr;
use tokio::net::TcpListener;
use tracing::{info, warn};
use talos::config::init_config;
use talos::errors::{LicenseError, LicenseResult};
use talos::server::bootstrap::{check_bootstrap_token, execute_token_command, parse_token_command};
use talos::server::database::Database;
use talos::server::handlers::AppState;
use talos::server::routes::build_router;
#[cfg(feature = "jwt-auth")]
use talos::server::auth::AuthState;
#[tokio::main]
async fn main() -> LicenseResult<()> {
let args: Vec<String> = std::env::args().collect();
let token_cmd = parse_token_command(&args);
let config = init_config()?;
if config.logging.enabled {
tracing_subscriber::fmt::init();
}
let db = Database::new().await?;
if execute_token_command(&db, token_cmd).await? {
return Ok(()); }
if let Some(raw_token) = check_bootstrap_token(&db).await? {
warn!("═══════════════════════════════════════════════════════");
warn!("BOOTSTRAP TOKEN CREATED - SAVE THIS VALUE:");
warn!("{}", raw_token);
warn!("═══════════════════════════════════════════════════════");
}
#[cfg(feature = "jwt-auth")]
let auth = AuthState::from_config(&config.auth)?;
let state = AppState {
db,
#[cfg(feature = "jwt-auth")]
auth,
};
let app = build_router(state);
let addr: SocketAddr = format!("{}:{}", config.server.host, config.server.port)
.parse()
.map_err(|e| LicenseError::ConfigError(format!("invalid server address: {e}")))?;
let listener = TcpListener::bind(addr)
.await
.map_err(|e| LicenseError::ServerError(format!("failed to bind to {}: {}", addr, e)))?;
info!("Talos server listening on http://{}", addr);
axum::serve(
listener,
app.into_make_service_with_connect_info::<SocketAddr>(),
)
.await
.map_err(|e| LicenseError::ServerError(format!("server failed: {e}")))?;
Ok(())
}