tanoshi_vm/extension/
source.rs1use 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}