use crate::config::{arch, env_type, os};
use mlua::{UserData, UserDataFields};
use once_cell::sync::Lazy;
use std::path::PathBuf;
use std::sync::Mutex;
#[derive(Debug, Clone)]
pub(crate) struct Runtime {
pub(crate) os: String,
pub(crate) arch: String,
pub(crate) env_type: Option<String>,
pub(crate) version: String,
pub(crate) plugin_dir_path: PathBuf,
}
static RUNTIME: Lazy<Mutex<Runtime>> = Lazy::new(|| {
Mutex::new(Runtime {
os: os(),
arch: arch(),
env_type: env_type(),
version: "0.6.0".to_string(), plugin_dir_path: PathBuf::new(),
})
});
impl Runtime {
pub(crate) fn get(plugin_dir_path: PathBuf) -> Runtime {
let mut runtime = RUNTIME.lock().unwrap().clone();
runtime.plugin_dir_path = plugin_dir_path;
runtime
}
pub(crate) fn with_platform(plugin_dir_path: PathBuf, os: &str, arch: &str) -> Runtime {
let mut runtime = Self::get(plugin_dir_path);
runtime.os = os.to_string();
runtime.arch = arch.to_string();
runtime.env_type = None; runtime
}
#[cfg(test)]
pub(crate) fn set_os(os: String) {
let mut runtime = RUNTIME.lock().unwrap();
runtime.os = os;
}
#[cfg(test)]
pub(crate) fn set_arch(arch: String) {
let mut runtime = RUNTIME.lock().unwrap();
runtime.arch = arch;
}
#[cfg(test)]
pub(crate) fn set_env_type(et: Option<String>) {
let mut runtime = RUNTIME.lock().unwrap();
runtime.env_type = et;
}
#[cfg(test)]
pub(crate) fn reset() {
let mut runtime = RUNTIME.lock().unwrap();
runtime.os = os();
runtime.arch = arch();
runtime.env_type = env_type();
}
}
impl UserData for Runtime {
fn add_fields<F: UserDataFields<Self>>(fields: &mut F) {
fields.add_field_method_get("osType", |_, t| Ok(t.os.clone()));
fields.add_field_method_get("archType", |_, t| Ok(t.arch.clone()));
fields.add_field_method_get("envType", |_, t| Ok(t.env_type.clone()));
fields.add_field_method_get("version", |_, t| Ok(t.version.clone()));
fields.add_field_method_get("pluginDirPath", |_, t| Ok(t.plugin_dir_path.clone()));
}
}