1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, DeriveInput};
4
5#[proc_macro_derive(AppendOnlyStream)]
6pub fn nostrstore_derive(input: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(input as DeriveInput);
8 let name = input.ident;
9
10 let expanded = quote! {
11
12 impl nostrstore::Operation for #name
13 where
14 #name: Clone + serde::Serialize + serde::de::DeserializeOwned
15 {
16 type Value = Vec<#name>;
17
18 fn default() -> Self::Value {
19 Vec::new()
20 }
21
22 fn deserialize(value: String) -> Result<#name, Box<dyn std::error::Error>> {
23 Ok(serde_json::from_str(&value)?)
24 }
25
26 fn serialize(&self) -> Result<String, Box<dyn std::error::Error>> {
27 Ok(serde_json::to_string(&self)?)
28 }
29
30 fn apply(&self, mut value: Self::Value) -> Self::Value {
31 value.push(self.clone());
32 value
33 }
34 }
35 };
36
37 TokenStream::from(expanded)
38}