libipld_cbor_derive/
lib.rs1use proc_macro2::{Span, TokenStream};
2use proc_macro_crate::{crate_name, FoundCrate};
3use quote::quote;
4use synstructure::{decl_derive, Structure};
5
6decl_derive!([DagCbor, attributes(ipld)] => dag_cbor_derive);
7
8mod ast;
9mod attr;
10mod gen;
11mod parse;
12
13fn dag_cbor_derive(s: Structure) -> TokenStream {
14 let libipld = match use_crate("libipld") {
15 Ok(ident) => ident,
16 Err(error) => return error,
17 };
18 let ast = parse::parse(&s);
19 let encode = gen::gen_encode(&ast, &libipld);
20 let decode = gen::gen_decode(&ast, &libipld);
21 quote! {
22 #encode
23 #decode
24 }
25}
26
27fn use_crate(name: &str) -> Result<syn::Ident, TokenStream> {
32 match crate_name(name) {
33 Ok(FoundCrate::Name(n)) => Ok(syn::Ident::new(&n, Span::call_site())),
34 Ok(FoundCrate::Itself) => Ok(syn::Ident::new("crate", Span::call_site())),
35 Err(err) => Err(syn::Error::new(Span::call_site(), err).to_compile_error()),
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 #[test]
42 fn test() {
43 let t = trybuild::TestCases::new();
44 t.pass("examples/basic.rs");
45 t.pass("examples/name_attr.rs");
46 t.pass("examples/repr_attr.rs");
47 }
48}