treesitter_types_macros/
lib.rs1use proc_macro::TokenStream;
11
12#[proc_macro]
22pub fn generate_types(input: TokenStream) -> TokenStream {
23 let input: proc_macro2::TokenStream = input.into();
24 match generate_types_impl(input) {
25 Ok(tokens) => tokens.into(),
26 Err(err) => err.into_compile_error().into(),
27 }
28}
29
30fn generate_types_impl(
31 input: proc_macro2::TokenStream,
32) -> Result<proc_macro2::TokenStream, syn::Error> {
33 let lit: syn::LitStr = syn::parse2(input)?;
34 let rel_path = lit.value();
35
36 let manifest_dir = std::env::var("CARGO_MANIFEST_DIR")
38 .map_err(|_| syn::Error::new(lit.span(), "CARGO_MANIFEST_DIR not set"))?;
39 let full_path = std::path::Path::new(&manifest_dir).join(&rel_path);
40
41 let json = std::fs::read_to_string(&full_path).map_err(|e| {
42 syn::Error::new(
43 lit.span(),
44 format!("failed to read {}: {e}", full_path.display()),
45 )
46 })?;
47
48 treesitter_types::codegen::generate(&json)
49 .map_err(|e| syn::Error::new(lit.span(), format!("codegen failed: {e}")))
50}