tanoshi_vm/extension/
source.rs

1use libloading::Library;
2use once_cell::sync::OnceCell;
3use tanoshi_lib::prelude::Extension;
4
5pub struct Source {
6    pub(crate) extension: OnceCell<Box<dyn Extension>>,
7    #[allow(dead_code)]
8    pub(crate) lib: Option<Library>,
9    pub rustc_version: String,
10    pub lib_version: String,
11}
12
13impl Source {
14    pub fn new(lib: Library, rustc_version: &str, lib_version: &str) -> Source {
15        Source {
16            lib: Some(lib),
17            rustc_version: rustc_version.to_string(),
18            lib_version: lib_version.to_string(),
19            extension: OnceCell::new(),
20        }
21    }
22
23    pub fn from(extension: Box<dyn Extension>) -> Self {
24        Self {
25            lib: None,
26            rustc_version: tanoshi_lib::RUSTC_VERSION.to_string(),
27            lib_version: tanoshi_lib::LIB_VERSION.to_string(),
28            extension: OnceCell::from(extension),
29        }
30    }
31}
32
33impl tanoshi_lib::extensions::PluginRegistrar for Source {
34    fn register_function(&mut self, extension: Box<dyn Extension>) {
35        self.extension
36            .set(extension)
37            .map_err(|_| "extension already initiated")
38            .unwrap();
39    }
40}