use endbasic_core::*;
use std::cell::RefCell;
use std::rc::Rc;
pub(super) struct GetDataCommand {
metadata: Rc<CallableMetadata>,
output: Rc<RefCell<String>>,
}
impl GetDataCommand {
pub(super) fn new(output: Rc<RefCell<String>>) -> Rc<Self> {
Rc::from(Self {
metadata: CallableMetadataBuilder::new("GETDATA")
.with_syntax(&[(&[], None)])
.test_build(),
output,
})
}
}
fn format_datum(datum: &Option<ConstantDatum>) -> String {
match datum {
None => "()".to_owned(),
Some(ConstantDatum::Boolean(b)) => format!("{b}?"),
Some(ConstantDatum::Double(d)) => format!("{d}#"),
Some(ConstantDatum::Integer(i)) => format!("{i}%"),
Some(ConstantDatum::Text(s)) => format!("{s}$"),
}
}
impl Callable for GetDataCommand {
fn metadata(&self) -> Rc<CallableMetadata> {
self.metadata.clone()
}
fn exec(&self, scope: Scope<'_>) -> CallResult<()> {
let text = scope
.data()
.iter()
.enumerate()
.map(|(i, datum)| format!("{i}={}", format_datum(datum)))
.collect::<Vec<String>>()
.join(" ");
let mut output = self.output.borrow_mut();
output.push_str(&text);
output.push('\n');
Ok(())
}
}