use code_analyze_mcp::{
CodeAnalyzer,
logging::McpLoggingLayer,
metrics::{MetricEvent, MetricsSender, MetricsWriter},
};
use rmcp::serve_server;
use rmcp::transport::stdio;
use std::sync::{Arc, Mutex};
use tokio::sync::Mutex as TokioMutex;
use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
if std::env::args().any(|a| a == "--version") {
println!("{}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
let peer = Arc::new(TokioMutex::new(None));
let log_level_filter = Arc::new(Mutex::new(LevelFilter::WARN));
let (event_tx, event_rx) = tokio::sync::mpsc::unbounded_channel();
let mcp_logging_layer = McpLoggingLayer::new(event_tx, log_level_filter.clone());
tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer())
.with(mcp_logging_layer)
.init();
let (metrics_tx, metrics_rx) = tokio::sync::mpsc::unbounded_channel::<MetricEvent>();
tokio::spawn(MetricsWriter::new(metrics_rx, None).run());
let analyzer = CodeAnalyzer::new(peer, log_level_filter, event_rx, MetricsSender(metrics_tx));
let (stdin, stdout) = stdio();
let service = serve_server(analyzer, (stdin, stdout)).await?;
service.waiting().await?;
Ok(())
}