Skip to main content

leta_daemon/
lib.rs

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}