1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#![feature(proc_macro_span)]
#![feature(register_tool)]
#![register_tool(tarpaulin)]
use std::path::Path;
#[tarpaulin::skip]
#[proc_macro]
pub fn include_kaitai(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
let cloned = item.clone();
let ast = syn::parse_macro_input!(item as syn::Expr);
let filename = match ast {
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(ref s),
..
}) => s.value(),
_ => panic!("invalid input"),
};
let mut source_file_path = proc_macro::Span::call_site().source_file().path();
source_file_path.pop();
let file_path = source_file_path.join(Path::new(&filename));
let file_contents = std::fs::read_to_string(file_path).expect("error reading file: ");
let _structure =
&yaml_rust::YamlLoader::load_from_str(&file_contents).expect("error parsing file: ")[0];
cloned
}