Skip to main content

better_auth_entity_codegen/
secondary.rs

1use super::*;
2/// Generate the secondary-storage snapshot codec over every model field.
3#[must_use]
4pub fn secondary_codec(fields: &FieldsNamed, core_root: &TokenStream) -> TokenStream {
5    let names: Vec<_> = fields
6        .named
7        .iter()
8        .filter_map(|field| field.ident.as_ref())
9        .collect();
10    let keys: Vec<_> = names.iter().map(|name| name.to_string()).collect();
11    quote! {
12        fn secondary_snapshot(&self) -> #core_root::AuthResult<::serde_json::Value> {
13            let mut snapshot = ::serde_json::Map::new();
14            #(drop(snapshot.insert(#keys.to_owned(), ::serde_json::to_value(&self.#names)?));)*
15            Ok(::serde_json::Value::Object(snapshot))
16        }
17        fn from_secondary_snapshot(snapshot: ::serde_json::Value) -> #core_root::AuthResult<Self> {
18            let ::serde_json::Value::Object(mut fields) = snapshot else {
19                return Err(#core_root::AuthError::internal("Invalid secondary model snapshot"));
20            };
21            Ok(Self {
22                #(#names: ::serde_json::from_value(fields.remove(#keys).ok_or_else(||
23                    #core_root::AuthError::internal("Incomplete secondary model snapshot"))?)?,)*
24            })
25        }
26    }
27}