espr 0.4.0

EXPRESS Language compiler
Documentation
use espr::{ast::SyntaxTree, codegen::rust::*, ir::IR};

const EXPRESS: &str = r#"
SCHEMA test_schema;
  ENTITY loop;
    a: REAL;
  END_ENTITY;

  ENTITY a;
    z: REAL;
    a_loop: loop;
  END_ENTITY;

  TYPE b = loop;
  END_TYPE;

  ENTITY c;
    loop: b;
  END_ENTITY;
END_SCHEMA;
"#;

#[test]
fn reserved_keyword() {
    let st = SyntaxTree::parse(EXPRESS).unwrap();
    let ir = IR::from_syntax_tree(&st).unwrap();
    let tt = ir.to_token_stream(CratePrefix::External).to_string();

    let tt = rustfmt(tt);

    insta::assert_snapshot!(tt, @r###"
    pub mod test_schema {
        use ruststep::{as_holder, derive_more::*, primitive::*, Holder, TableInit};
        use std::collections::HashMap;
        #[derive(Debug, Clone, PartialEq, Default, TableInit)]
        pub struct Tables {
            r#loop: HashMap<u64, as_holder!(Loop)>,
            a: HashMap<u64, as_holder!(A)>,
            c: HashMap<u64, as_holder!(C)>,
            b: HashMap<u64, as_holder!(B)>,
        }
        impl Tables {
            pub fn loop_holders(&self) -> &HashMap<u64, as_holder!(Loop)> {
                &self.r#loop
            }
            pub fn a_holders(&self) -> &HashMap<u64, as_holder!(A)> {
                &self.a
            }
            pub fn c_holders(&self) -> &HashMap<u64, as_holder!(C)> {
                &self.c
            }
            pub fn b_holders(&self) -> &HashMap<u64, as_holder!(B)> {
                &self.b
            }
        }
        #[derive(
            Clone, Debug, PartialEq, AsRef, Deref, DerefMut, Into, From, :: ruststep_derive :: Holder,
        )]
        # [holder (table = Tables)]
        # [holder (field = b)]
        #[holder(generate_deserialize)]
        pub struct B(#[holder(use_place_holder)] pub Loop);
        #[derive(Debug, Clone, PartialEq, :: derive_new :: new, Holder)]
        # [holder (table = Tables)]
        # [holder (field = r#loop)]
        #[holder(generate_deserialize)]
        pub struct Loop {
            pub a: f64,
        }
        #[derive(Debug, Clone, PartialEq, :: derive_new :: new, Holder)]
        # [holder (table = Tables)]
        # [holder (field = a)]
        #[holder(generate_deserialize)]
        pub struct A {
            pub z: f64,
            #[holder(use_place_holder)]
            pub a_loop: Loop,
        }
        #[derive(Debug, Clone, PartialEq, :: derive_new :: new, Holder)]
        # [holder (table = Tables)]
        # [holder (field = c)]
        #[holder(generate_deserialize)]
        pub struct C {
            #[holder(use_place_holder)]
            pub r#loop: B,
        }
    }
    "###);
}