zamm_yang 0.1.8

A basic, experimental code generator
Documentation
use crate::codegen::template::basic::{
    AppendedFragment, AssertFragment, AtomicFragment, CodeFragment, FunctionCallFragment,
    FunctionFragment,
};
use std::cell::RefCell;
use std::rc::Rc;

pub fn kb_test_function(name: &str) -> FunctionFragment {
    let init_kb = Rc::new(RefCell::new(FunctionCallFragment::new(AtomicFragment {
        imports: vec!["crate::tao::initialize_kb".to_owned()],
        atom: "initialize_kb".to_owned(),
    })));
    let mut new_test = FunctionFragment::new(name.to_owned());
    new_test.mark_as_test();
    new_test.append(init_kb);
    new_test
}

pub fn new_kb_test(test_frag: &mut AppendedFragment, name: &str) -> Rc<RefCell<FunctionFragment>> {
    let rc = Rc::new(RefCell::new(kb_test_function(name)));
    test_frag.append(rc.clone());
    rc
}

pub fn add_assert_frags(
    test_function: &Rc<RefCell<FunctionFragment>>,
    lhs: Rc<RefCell<dyn CodeFragment>>,
    rhs: Rc<RefCell<dyn CodeFragment>>,
) {
    test_function
        .borrow_mut()
        .append(Rc::new(RefCell::new(AssertFragment::new_eq(lhs, rhs))));
}

pub fn add_assert(test_function: &Rc<RefCell<FunctionFragment>>, lhs: String, rhs: String) {
    add_assert_frags(
        test_function,
        Rc::new(RefCell::new(AtomicFragment::new(lhs))),
        Rc::new(RefCell::new(AtomicFragment::new(rhs))),
    );
}