Skip to main content

spider_macro/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemStruct};
6
7/// A procedural macro to derive the `ScrapedItem` trait.
8#[proc_macro_attribute]
9pub fn scraped_item(_attr: TokenStream, item: TokenStream) -> TokenStream {
10    let ast = parse_macro_input!(item as ItemStruct);
11    let name = &ast.ident;
12
13    let expanded = quote! {
14        #[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
15        #ast
16
17        impl ScrapedItem for #name {
18            fn as_any(&self) -> &dyn ::std::any::Any {
19                self
20            }
21
22            fn box_clone(&self) -> Box<dyn ScrapedItem + Send + Sync> {
23                Box::new(self.clone())
24            }
25
26            fn to_json_value(&self) -> ::serde_json::Value {
27                ::serde_json::to_value(self).unwrap()
28            }
29        }
30    };
31
32    TokenStream::from(expanded)
33}