use std::path::Path;
use mineral_config::{ConfigWarning, Error, Result};
use mineral_script::mlua::Lua;
use super::DaemonConfig;
use super::callbacks::prepare_daemon;
pub(super) const DEFAULT: &str = include_str!("lua/daemon-default.lua");
pub struct DaemonLoad {
pub config: DaemonConfig,
pub warnings: Vec<ConfigWarning>,
pub vm: Option<Lua>,
pub tree: serde_json::Value,
}
pub fn load_daemon(user_path: &Path) -> Result<(DaemonConfig, Vec<ConfigWarning>)> {
let lua = Lua::new();
let loaded = mineral_config::load_file(
&lua,
user_path,
DEFAULT,
"daemon-default.lua",
prepare_daemon,
)?;
Ok((loaded.config, loaded.warnings))
}
pub fn load_daemon_with_vm(
user_path: &Path,
install: impl FnOnce(&Lua) -> mineral_script::mlua::Result<()>,
) -> Result<DaemonLoad> {
let lua = Lua::new();
install(&lua).map_err(|source| Error::Lua {
operation: "安装 daemon 脚本 API",
source,
})?;
let loaded = mineral_config::load_file(
&lua,
user_path,
DEFAULT,
"daemon-default.lua",
prepare_daemon,
)?;
Ok(DaemonLoad {
config: loaded.config,
warnings: loaded.warnings,
vm: loaded.user_loaded.then_some(lua),
tree: loaded.tree,
})
}
impl DaemonConfig {
pub fn defaults() -> Result<Self> {
let (config, _) = mineral_config::defaults(DEFAULT, "daemon-default.lua", prepare_daemon)?;
Ok(config)
}
}
#[cfg(test)]
pub(crate) fn default_daemon_tree() -> Result<serde_json::Value> {
let (_, tree) =
mineral_config::defaults::<DaemonConfig>(DEFAULT, "daemon-default.lua", prepare_daemon)?;
Ok(tree)
}
pub(crate) fn daemon_from_tree(
tree: &serde_json::Value,
) -> std::result::Result<DaemonConfig, ConfigWarning> {
mineral_config::deserialize_tree(tree)
}