1use fastrace::trace;
2use leta_config::{get_cache_dir, get_log_dir, Config, DaemonLock};
3use tracing::info;
4use tracing_subscriber::EnvFilter;
5
6pub mod handlers;
7mod profiling;
8mod server;
9pub mod session;
10
11#[trace]
12pub async fn run() -> anyhow::Result<()> {
13 let log_dir = get_log_dir();
14 std::fs::create_dir_all(&log_dir)?;
15
16 let log_file = std::fs::OpenOptions::new()
17 .create(true)
18 .append(true)
19 .open(log_dir.join("daemon.log"))?;
20
21 let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
22
23 tracing_subscriber::fmt()
24 .with_env_filter(filter)
25 .with_writer(log_file)
26 .with_ansi(false)
27 .init();
28
29 let _lock = match DaemonLock::acquire() {
30 Some(lock) => lock,
31 None => {
32 info!("Another daemon instance is already running, exiting");
33 return Ok(());
34 }
35 };
36
37 let mut config = Config::load()?;
38 let removed = config.cleanup_stale_workspace_roots();
39 if !removed.is_empty() {
40 info!("Cleaned up {} stale workspace roots", removed.len());
41 }
42
43 let cache_dir = get_cache_dir();
44 std::fs::create_dir_all(&cache_dir)?;
45
46 let hover_cache_size = config.daemon.hover_cache_size;
47 let symbol_cache_size = config.daemon.symbol_cache_size;
48
49 let hover_cache =
50 leta_cache::LmdbCache::new(&cache_dir.join("hover_cache.lmdb"), hover_cache_size)?;
51 let symbol_cache =
52 leta_cache::LmdbCache::new(&cache_dir.join("symbol_cache.lmdb"), symbol_cache_size)?;
53
54 let daemon = server::DaemonServer::new(config, hover_cache, symbol_cache);
55
56 info!("Starting leta daemon");
57 daemon.run().await?;
58
59 Ok(())
60}