codama_macros/
lib.rs

1use codama_attributes::{AttributeContext, CodamaAttribute};
2use codama_errors::{CodamaError, CodamaResult};
3use codama_koroks::CrateKorok;
4use codama_stores::CrateStore;
5use proc_macro::TokenStream;
6use proc_macro2::TokenStream as TokenStream2;
7use quote::quote;
8
9#[proc_macro_derive(CodamaAccount, attributes(codama))]
10pub fn codama_account_derive(input: TokenStream) -> TokenStream {
11    codama_derive(input.into())
12        .unwrap_or_else(CodamaError::into_compile_error)
13        .into()
14}
15
16#[proc_macro_derive(CodamaAccounts, attributes(codama))]
17pub fn codama_accounts_derive(input: TokenStream) -> TokenStream {
18    codama_derive(input.into())
19        .unwrap_or_else(CodamaError::into_compile_error)
20        .into()
21}
22
23#[proc_macro_derive(CodamaErrors, attributes(codama))]
24pub fn codama_errors_derive(input: TokenStream) -> TokenStream {
25    codama_derive(input.into())
26        .unwrap_or_else(CodamaError::into_compile_error)
27        .into()
28}
29
30#[proc_macro_derive(CodamaInstruction, attributes(codama))]
31pub fn codama_instruction_derive(input: TokenStream) -> TokenStream {
32    codama_derive(input.into())
33        .unwrap_or_else(CodamaError::into_compile_error)
34        .into()
35}
36
37#[proc_macro_derive(CodamaInstructions, attributes(codama))]
38pub fn codama_instructions_derive(input: TokenStream) -> TokenStream {
39    codama_derive(input.into())
40        .unwrap_or_else(CodamaError::into_compile_error)
41        .into()
42}
43
44#[proc_macro_derive(CodamaType, attributes(codama))]
45pub fn codama_type_derive(input: TokenStream) -> TokenStream {
46    codama_derive(input.into())
47        .unwrap_or_else(CodamaError::into_compile_error)
48        .into()
49}
50
51fn codama_derive(input: TokenStream2) -> CodamaResult<TokenStream2> {
52    let store = CrateStore::hydrate(input)?;
53    CrateKorok::parse(&store)?;
54    Ok(quote! {})
55}
56
57#[proc_macro_attribute]
58pub fn codama(attr: TokenStream, input: TokenStream) -> TokenStream {
59    codama_attribute(attr.into(), input.into())
60        .unwrap_or_else(CodamaError::into_compile_error)
61        .into()
62}
63
64fn codama_attribute(attr: TokenStream2, input: TokenStream2) -> CodamaResult<TokenStream2> {
65    let attr: syn::Attribute = syn::parse_quote! { #[codama(#attr)] };
66    let item: syn::Item = syn::parse2(input.clone())?;
67    let ctx: AttributeContext = (&item).into();
68    CodamaAttribute::parse(&attr, &ctx)?;
69    Ok(input)
70}