mrubyedge_cli/template/
source.rs

1extern crate askama;
2
3use askama::Template;
4
5#[derive(Template)]
6#[template(path = "lib.rs.tmpl", escape = "none")]
7pub struct LibRs<'a> {
8    pub file_basename: &'a str,
9
10    pub ftypes: &'a [RustFnTemplate<'a>],
11    pub ftypes_imports: &'a [RustImportFnTemplate<'a>],
12}
13
14pub struct RustFnTemplate<'a> {
15    pub func_name: &'a str,
16    pub args_decl: &'a str,
17    pub args_let_vec: &'a str,
18    pub str_args_converter: &'a str,
19    pub rettype_decl: &'a str,
20    pub handle_retval: &'a str,
21    pub exported_helper_var: &'a str,
22}
23
24pub struct RustImportFnTemplate<'a> {
25    pub func_name: &'a str,
26    pub args_decl: &'a str,
27    pub imported_body: &'a str,
28    pub rettype_decl: &'a str,
29    pub import_helper_var: &'a str,
30}
31
32#[test]
33fn test_lib_rs_template() {
34    use crate::rbs_parser::parse;
35
36    let def = "
37def foo_bar: (Integer) -> Integer
38";
39
40    let ret = parse(def).unwrap();
41    let ftype = ret.1;
42    let ftypes = vec![RustFnTemplate {
43        func_name: &ftype[0].name,
44        args_decl: "a: i32",
45        args_let_vec: "vec![std::rc::Rc::new(RObject::RInteger(a as i64))]",
46        rettype_decl: "-> i32",
47        str_args_converter: "// do nothing",
48        handle_retval: "5471",
49        exported_helper_var: "",
50    }];
51    let imports = vec![];
52
53    let lib_rs = LibRs {
54        file_basename: "world",
55        ftypes: &ftypes,
56        ftypes_imports: &imports,
57    };
58
59    let rendered = lib_rs.render().unwrap();
60    if std::env::var("VERBOSE").is_ok() {
61        println!("{}", &rendered);
62    }
63
64    assert!(syn::parse_file(&rendered).is_ok());
65}