1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemStruct};
6
7#[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}