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
33
34
35
36
37
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro_hack::proc_macro_hack;
use quote::quote;
use syn::{parse_macro_input, LitStr};
use crate::dir::Dir;
use std::env;
use std::path::PathBuf;
mod dir;
mod file;
#[proc_macro_hack]
pub fn include_dir(input: TokenStream) -> TokenStream {
let input: LitStr = parse_macro_input!(input as LitStr);
let crate_root = env::var("CARGO_MANIFEST_DIR").unwrap();
let path = PathBuf::from(crate_root).join(input.value());
if !path.exists() {
panic!("\"{}\" doesn't exist", path.display());
}
let path = path.canonicalize().expect("Can't normalize the path");
let dir = Dir::from_disk(&path, &path).expect("Couldn't load the directory");
TokenStream::from(quote! {
#dir
})
}