use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; use lazy_static::lazy_static; use mlua::{UserData, UserDataFields}; use self::{keymap::KeyMap, theme::Theme}; pub mod constants; pub mod theme; pub mod keymap; #[derive(Debug, Default)] pub struct GlobalConfig { pub theme: Theme, pub keymap: KeyMap, } lazy_static! { static ref GLOBAL_CONFIG: RwLock = RwLock::new(GlobalConfig::new()); } const DUMMY_CONFIG: GlobalConfig = GlobalConfig::new(); impl GlobalConfig { const fn new() -> Self { Self { theme: Theme::new(), keymap: KeyMap::new(), } } pub fn instance() -> RwLockReadGuard<'static, Self> { GLOBAL_CONFIG.read().unwrap() } pub fn instance_mut() -> RwLockWriteGuard<'static, Self> { GLOBAL_CONFIG.write().unwrap() } } impl UserData for GlobalConfig { fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_function_get("theme", |_, _| Ok(DUMMY_CONFIG.theme)); fields.add_field_function_get("keymap", |_, _| Ok(DUMMY_CONFIG.keymap)); } }