nuidl_lib/
lib.rs

1use lalrpop_util::lalrpop_mod;
2
3lalrpop_mod!(pub midl);
4
5pub mod codegen;
6pub mod parser;
7
8#[cfg(feature = "cargo")]
9pub mod cargo;
10
11#[cfg(test)]
12mod tests {
13    use crate::midl;
14
15    #[test]
16    fn import_include() {
17        midl::ImportParser::new()
18            .parse("import \"iunknown.idl\"")
19            .unwrap();
20        midl::IncludeParser::new()
21            .parse("include \"iunknown.idl\", \"blah.idl\", \"file with spaces.idl\"")
22            .unwrap();
23        assert!(midl::ImportParser::new()
24            .parse("import \"unfinished")
25            .is_err());
26    }
27
28    #[test]
29    fn ctype() {
30        midl::CtypeParser::new().parse("int").unwrap();
31        midl::CtypeParser::new().parse("int *").unwrap();
32        midl::CtypeParser::new().parse("int ***").unwrap();
33        midl::CtypeParser::new()
34            .parse("const int *const *")
35            .unwrap();
36        midl::CtypeParser::new()
37            .parse("int **const *const **")
38            .unwrap();
39        assert!(midl::CtypeParser::new().parse("const int const").is_err());
40        assert!(midl::CtypeParser::new()
41            .parse("int const * const const")
42            .is_err());
43    }
44
45    #[test]
46    fn function() {
47        midl::FnArgParser::new().parse("int x").unwrap();
48        midl::FnArgParser::new().parse("int y").unwrap();
49        midl::FunctionParser::new().parse("int AddRef()").unwrap();
50        midl::FunctionParser::new()
51            .parse("[ptr] void *QueryInterface([in] const IID *itf_type)")
52            .unwrap();
53    }
54
55    #[test]
56    fn interface() {
57        midl::InterfaceParser::new()
58            .parse("[object] interface IUnknown {}")
59            .unwrap();
60    }
61
62    #[test]
63    fn it_works() {
64        let res = midl::FileParser::new().parse(include_str!("test.idl"));
65
66        match res {
67            Err(e) => {
68                println!("{}", e);
69                panic!();
70            }
71            Ok(v) => {
72                println!("{:?}", v);
73            }
74        }
75    }
76}