nostrstore_derive/
lib.rs

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}