use crate::shared::{PtrMagic, var::{pxs_Var, pxs_VarT}};
use std::sync::Arc;
#[derive(Clone)]
#[allow(non_camel_case_types)]
pub struct pxs_Module {
pub name: String,
pub callbacks: Vec<ModuleCallback>,
pub variables: Vec<ModuleVariable>,
pub modules: Vec<Arc<pxs_Module>>
}
#[derive(Clone)]
pub struct ModuleCallback {
pub name: String,
pub full_name: String,
pub idx: i32,
}
#[derive(Clone)]
pub struct ModuleVariable {
pub name: String,
pub var: *mut pxs_Var,
}
impl ModuleVariable {
pub fn new(name:String, var: pxs_VarT) -> Self {
Self {
name,
var
}
}
}
impl pxs_Module {
pub fn new(name: String) -> Self {
pxs_Module {
name: name,
callbacks: vec![],
variables: vec![],
modules: vec![],
}
}
pub fn add_callback(&mut self, name: &str, full_name: &str, idx: i32) {
self.callbacks.push(ModuleCallback {
name: name.to_string(),
full_name: full_name.to_string(),
idx,
});
}
pub fn add_variable(&mut self, name: &str, var: *mut pxs_Var) {
self.variables.push(ModuleVariable {
name: name.to_string(),
var: var,
});
}
pub fn add_module(&mut self, child: Arc<pxs_Module>) {
self.modules.push(child);
}
pub fn get_name(&self) -> String {
if !self.name.contains(".") {
self.name.clone()
} else {
self.name.split(".").last().unwrap().to_string()
}
}
pub fn get_pkg(&self) -> String {
if !self.name.contains(".") {
String::new()
} else {
let name = self.get_name();
self.name.replace(&format!(".{name}"), "")
}
}
}
impl PtrMagic for pxs_Module {}
unsafe impl Send for pxs_Module {}
unsafe impl Sync for pxs_Module {}
unsafe impl Send for ModuleCallback {}
unsafe impl Sync for ModuleCallback {}
unsafe impl Send for ModuleVariable {}
unsafe impl Sync for ModuleVariable {}
impl Drop for pxs_Module {
fn drop(&mut self) {
for var in self.variables.drain(0..self.variables.len()) {
if var.var.is_null() {
continue;
}
let _ = pxs_Var::from_raw(var.var);
}
}
}