anodized_core/instrument/data/
mod.rs1use 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 use #ident::*;
57 #(#statements)*
58 }
59 }
60 };
61 spec_impl.to_tokens(&mut tokens);
62 }
63
64 Ok(tokens)
65 }
66}