use std::rc::Rc;
use zlang::{ZLang, ZType, ZData};
struct MyState {}
fn main() {
let mut lang: ZLang<MyState> = ZLang::new();
lang.register_function(
"inspect_data",
|_state: &mut MyState, _interp: &ZLang<MyState>, args: Vec<ZType>| {
for z in args {
match &z.data {
ZData::Raw(bytes) => {
println!("Raw bytes: {:?}", bytes);
}
ZData::Dyn(any) => {
if z.tag == Rc::<str>::from("string") {
let s = any.downcast_ref::<String>().unwrap();
println!("String: {}", s);
} else if z.tag == Rc::<str>::from("num") {
let n = any.downcast_ref::<i64>().unwrap();
println!("Number: {}", n);
} else {
println!("Other dynamic type with tag {}", z.tag);
}
}
}
}
None
},
);
let program = r#"
inspect_data("Hello world")
"#;
lang.interpret(&mut MyState {}, program);
}