diff --git a/sea-orm-macros/src/derives/value_type.rs b/sea-orm-macros/src/derives/value_type.rs index a8b5bce623..cdb3b3a98f 100644 --- a/sea-orm-macros/src/derives/value_type.rs +++ b/sea-orm-macros/src/derives/value_type.rs @@ -1,56 +1,43 @@ -// pub use sea_query::ArrayType; -// use heck::ToUpperCamelCase; -// use proc_macro2::Span; use proc_macro2::TokenStream; -// use quote::format_ident; -use quote::{quote, ToTokens}; -// use quote::quote_spanned; -// use syn::punctuated::Punctuated; -// use syn::spanned::Spanned; -use syn::Token; -// use syn::Expr; -// use syn::Meta; -use syn::Data; +use quote::quote; +use syn::Type; -// use self::util::GetAsKVMeta; -// use crate::{DeriveEntityModel, EnumIter, DeriveRelation}; - -struct DeriveValueType{ +struct DeriveValueType { name: syn::Ident, - internal: Data, - // tablename: String, + ty: Type, } impl DeriveValueType { pub fn new(input: syn::DeriveInput) -> Result { - let internal = input.data; + let dat = input.data; + let fields: Option> = match dat { + syn::Data::Struct(syn::DataStruct { + fields: syn::Fields::Unnamed(syn::FieldsUnnamed { unnamed, .. }), + .. + }) => Some(unnamed), + _ => None, + }; + let ty = fields + .expect("not a struct") + .first() + .expect("empty type") + .to_owned() + .ty; let name = input.ident; - // let tablename = "ab".to_string(); //todo - Ok( - DeriveValueType { name, internal } - ) + Ok(DeriveValueType { name, ty }) } fn expand(&self) -> syn::Result { - let expanded_impl_entity_name = self.impl_entity_name(); - + let expanded_impl_entity_name: TokenStream = self.impl_entity_name(); Ok(expanded_impl_entity_name) } fn impl_entity_name(&self) -> TokenStream { let name = &self.name; - let syn::Data::Struct(ty) = &self.internal else {panic!()}; - let internal_type = ty.struct_token; - // let tablename = &self.tablename; + let ty = &self.ty; quote!( - use sea_orm::entity::prelude::*; - - #[doc = " Generated by sea-orm-macros"] - #[derive(Clone, Debug, PartialEq, Eq)] - pub struct #name(pub #internal_type); - #[automatically_derived] impl From<#name> for Value { fn from(source: #name) -> Self { @@ -61,14 +48,14 @@ impl DeriveValueType { #[automatically_derived] impl sea_orm::TryGetable for #name { fn try_get_by(res: &QueryResult, idx: I) -> Result { - <#internal_type as sea_orm::TryGetable>::try_get_by(res, idx).map(|v| #name(v)) + <#ty as sea_orm::TryGetable>::try_get_by(res, idx).map(|v| #name(v)) } } #[automatically_derived] impl sea_query::ValueType for #name { fn try_from(v: Value) -> Result { - <#internal_type as sea_query::ValueType>::try_from(v).map(|v| #name(v)) + <#ty as sea_query::ValueType>::try_from(v).map(|v| #name(v)) } fn type_name() -> String { @@ -76,23 +63,20 @@ impl DeriveValueType { } fn array_type() -> sea_orm::sea_query::ArrayType { - <#internal_type as sea_orm::sea_query::ValueType>::array_type() + <#ty as sea_orm::sea_query::ValueType>::array_type() } fn column_type() -> sea_orm::sea_query::ColumnType { - <#internal_type as sea_orm::sea_query::ValueType>::column_type() + <#ty as sea_orm::sea_query::ValueType>::column_type() } } ) - } } pub fn expand_derive_value_type(input: syn::DeriveInput) -> syn::Result { - // let ident_span = input.ident.span(); - match DeriveValueType::new(input) { Ok(value_type) => value_type.expand(), Err(err) => Err(err), } -} \ No newline at end of file +}