Manage PrimaryKeyTrait::ValueType

This commit is contained in:
Marco Napetti 2021-09-07 10:18:37 +02:00
parent a4d70dfa55
commit abcdbf2a48

View File

@ -49,6 +49,7 @@ pub fn expand_derive_entity_model(data: Data, attrs: Vec<Attribute>) -> syn::Res
let mut columns_enum: Punctuated<_, Comma> = Punctuated::new(); let mut columns_enum: Punctuated<_, Comma> = Punctuated::new();
let mut columns_trait: Punctuated<_, Comma> = Punctuated::new(); let mut columns_trait: Punctuated<_, Comma> = Punctuated::new();
let mut primary_keys: Punctuated<_, Comma> = Punctuated::new(); let mut primary_keys: Punctuated<_, Comma> = Punctuated::new();
let mut primary_key_types: Punctuated<_, Comma> = Punctuated::new();
let mut auto_increment = true; let mut auto_increment = true;
if let Data::Struct(item_struct) = data { if let Data::Struct(item_struct) = data {
if let Fields::Named(fields) = item_struct.fields { if let Fields::Named(fields) = item_struct.fields {
@ -113,6 +114,7 @@ pub fn expand_derive_entity_model(data: Data, attrs: Vec<Attribute>) -> syn::Res
if let Some(name) = p.get_ident() { if let Some(name) = p.get_ident() {
if name == "primary_key" { if name == "primary_key" {
primary_keys.push(quote! { #field_name }); primary_keys.push(quote! { #field_name });
primary_key_types.push(field.ty.clone());
} }
else if name == "nullable" { else if name == "nullable" {
nullable = true; nullable = true;
@ -189,6 +191,13 @@ pub fn expand_derive_entity_model(data: Data, attrs: Vec<Attribute>) -> syn::Res
let primary_key = (!primary_keys.is_empty()).then(|| { let primary_key = (!primary_keys.is_empty()).then(|| {
let auto_increment = auto_increment && primary_keys.len() == 1; let auto_increment = auto_increment && primary_keys.len() == 1;
let primary_key_types = if primary_key_types.len() == 1 {
let first = primary_key_types.first();
quote! { #first }
}
else {
quote! { (#primary_key_types) }
};
quote! { quote! {
#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] #[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)]
pub enum PrimaryKey { pub enum PrimaryKey {
@ -196,6 +205,8 @@ pub enum PrimaryKey {
} }
impl PrimaryKeyTrait for PrimaryKey { impl PrimaryKeyTrait for PrimaryKey {
type ValueType = #primary_key_types;
fn auto_increment() -> bool { fn auto_increment() -> bool {
#auto_increment #auto_increment
} }