add partials
This commit is contained in:
parent
0cb1e28c20
commit
c7f0caf34a
3 changed files with 139 additions and 2 deletions
|
@ -42,6 +42,8 @@ pub fn model_derive(input: TokenStream) -> TokenStream {
|
|||
let input = parse_macro_input!(input as DeriveInput);
|
||||
|
||||
let name = input.ident;
|
||||
let name_str = name.to_string().to_snake();
|
||||
let partial_name = syn::Ident::new(&format!("Partial{}", name), name.span());
|
||||
|
||||
// Generate code for each field
|
||||
let field_code = if let Data::Struct(data_struct) = input.data {
|
||||
|
@ -91,8 +93,36 @@ pub fn model_derive(input: TokenStream) -> TokenStream {
|
|||
}
|
||||
}).collect();
|
||||
|
||||
let partial_struct: Vec<_> = fields_named
|
||||
.named
|
||||
.iter()
|
||||
.map(|field| {
|
||||
let field_name = &field.ident.as_ref().unwrap();
|
||||
let field_type = &field.ty;
|
||||
let field_name_str = field_name.to_string();
|
||||
|
||||
if field_name_str == "_id" {
|
||||
return quote! {
|
||||
pub _id: String,
|
||||
};
|
||||
}
|
||||
|
||||
if is_type(field_type, "Option") {
|
||||
return quote! {
|
||||
pub #field_name: #field_type,
|
||||
};
|
||||
}
|
||||
|
||||
quote! {
|
||||
pub #field_name: Option<#field_type>,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
quote! {
|
||||
impl mongod::model::Model for #name {
|
||||
type Partial = #partial_name;
|
||||
|
||||
async fn update_values(
|
||||
&mut self,
|
||||
obj: &serde_json::Map<String, serde_json::Value>,
|
||||
|
@ -101,6 +131,21 @@ pub fn model_derive(input: TokenStream) -> TokenStream {
|
|||
#( #field_process_code )*
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct #partial_name {
|
||||
#( #partial_struct )*
|
||||
}
|
||||
|
||||
impl mongod::model::reference::Referencable for #partial_name {
|
||||
fn collection_name() -> &'static str {
|
||||
#name_str
|
||||
}
|
||||
|
||||
fn id(&self) -> &str {
|
||||
&self._id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => unimplemented!(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue