use std::ops::DerefMut;
use crate::{lang::SError, Library, SDoc, SVal};
#[derive(Default, Debug)]
pub struct BoolLibrary;
impl BoolLibrary {
pub fn operate(&self, pid: &str, doc: &mut SDoc, name: &str, _bool: &mut bool, _parameters: &mut Vec<SVal>) -> Result<SVal, SError> {
match name {
_ => {
Err(SError::bool(pid, &doc, "NotFound", &format!("{} is not a function in the Bool Library", name)))
}
}
}
}
impl Library for BoolLibrary {
fn scope(&self) -> String {
"Bool".to_string()
}
fn call(&self, pid: &str, doc: &mut SDoc, name: &str, parameters: &mut Vec<SVal>) -> Result<SVal, SError> {
if parameters.len() > 0 {
match name {
"toString" => {
return Ok(SVal::String(parameters[0].print(doc)));
},
"or" => {
for param in parameters.drain(..) {
if !param.is_empty() {
return Ok(param);
}
}
return Ok(SVal::Null);
},
_ => {}
}
let mut params;
if parameters.len() > 1 {
params = parameters.drain(1..).collect();
} else {
params = Vec::new();
}
match &mut parameters[0] {
SVal::Bool(val) => {
return self.operate(pid, doc, name, val, &mut params);
},
SVal::Boxed(val) => {
let mut val = val.lock().unwrap();
let val = val.deref_mut();
match val {
SVal::Bool(val) => {
return self.operate(pid, doc, name, val, &mut params);
},
_ => {
return Err(SError::bool(pid, &doc, "InvalidArgument", "bool argument not found"));
}
}
},
_ => {
return Err(SError::bool(pid, &doc, "InvalidArgument", "bool argument not found"));
}
}
} else {
return Err(SError::bool(pid, &doc, "InvalidArgument", "bool argument not found"));
}
}
}