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