Skip to main content

anodized_core/instrument/data/
mod.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::{ItemEnum, ItemImpl, ItemStruct, Result, parse_quote};
4
5use crate::{DataSpec, instrument::Config};
6
7#[cfg(test)]
8mod tests;
9
10impl Config {
11    pub fn instrument_item_struct(
12        &self,
13        spec: DataSpec,
14        item_struct: ItemStruct,
15    ) -> Result<TokenStream> {
16        let mut tokens = TokenStream::new();
17
18        let ident = &item_struct.ident;
19        let (impl_generics, ty_generics, where_clause) = item_struct.generics.split_for_impl();
20        let statements = Self::build_precondition_fn_body(&spec.maintains).stmts;
21
22        item_struct.to_tokens(&mut tokens);
23
24        if self.embed_spec {
25            let spec_impl: ItemImpl = parse_quote! {
26                #[doc(hidden)]
27                #[allow(warnings)]
28                impl #impl_generics #ident #ty_generics #where_clause {
29                    fn __anodized_data_maintains(&self) {
30                        #(#statements)*
31                    }
32                }
33            };
34            spec_impl.to_tokens(&mut tokens);
35        }
36
37        Ok(tokens)
38    }
39
40    pub fn instrument_item_enum(&self, spec: DataSpec, item_enum: ItemEnum) -> Result<TokenStream> {
41        let mut tokens = TokenStream::new();
42
43        let ident = &item_enum.ident;
44        let (impl_generics, ty_generics, where_clause) = item_enum.generics.split_for_impl();
45        let statements = Self::build_precondition_fn_body(&spec.maintains).stmts;
46
47        item_enum.to_tokens(&mut tokens);
48
49        if self.embed_spec {
50            let spec_impl: ItemImpl = parse_quote! {
51                #[doc(hidden)]
52                #[allow(warnings)]
53                impl #impl_generics #ident #ty_generics #where_clause {
54                    fn __anodized_data_maintains(&self) {
55                        // Bring all variants into scope for convenience.
56                        use #ident::*;
57                        #(#statements)*
58                    }
59                }
60            };
61            spec_impl.to_tokens(&mut tokens);
62        }
63
64        Ok(tokens)
65    }
66}