use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use powerliners::ported::scripts::powerline_daemon as daemon;
use powerliners::ported::scripts::powerline_daemon::{RenderFn, SpawnWmFn};
#[path = "shared/render_runtime.rs"]
mod render_runtime;
fn main() {
let argv: Vec<String> = std::env::args().skip(1).collect();
let store: Arc<Mutex<HashMap<String, render_runtime::Configs>>> =
Arc::new(Mutex::new(HashMap::new()));
let renderer = render_runtime::make_renderer();
let store_clone = store.clone();
let renderer_clone = renderer.clone();
let render_fn: Arc<RenderFn> = Arc::new(move |args, environ, cwd, _is_daemon| {
let ext = args.ext.first().cloned().unwrap_or_default();
let configs = {
let mut guard = store_clone.lock().expect("config store poisoned");
let cached = guard.get(&ext).cloned();
let stale = cached.as_ref().map(|c| c.is_stale()).unwrap_or(false);
if stale {
guard.remove(&ext);
}
match (cached, stale) {
(Some(c), false) => c,
_ => match render_runtime::build_configs(&ext) {
Ok(c) => {
guard.insert(ext.clone(), c.clone());
c
}
Err(e) => {
return format!("powerline-daemon: config error: {}\n", e).into_bytes()
}
},
}
};
render_runtime::render_once(args, environ, cwd, &configs, &renderer_clone)
});
let spawn_wm_fn: Arc<SpawnWmFn> = Arc::new(|_name, _t_evt, _pl_evt| None);
let code = daemon::main(&argv, render_fn, spawn_wm_fn);
std::process::exit(code);
}