Skip to content

Commit

Permalink
completed derive value type
Browse files Browse the repository at this point in the history
  • Loading branch information
darkmmon committed Jun 26, 2023
1 parent c73f985 commit af071f9
Showing 1 changed file with 26 additions and 42 deletions.
68 changes: 26 additions & 42 deletions sea-orm-macros/src/derives/value_type.rs
Original file line number Diff line number Diff line change
@@ -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<Self, syn::Error> {
let internal = input.data;
let dat = input.data;
let fields: Option<syn::punctuated::Punctuated<syn::Field, syn::token::Comma>> = 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<TokenStream> {
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 {
Expand All @@ -61,38 +48,35 @@ impl DeriveValueType {
#[automatically_derived]
impl sea_orm::TryGetable for #name {
fn try_get_by<I: sea_orm::ColIdx>(res: &QueryResult, idx: I) -> Result<Self, sea_orm::TryGetError> {
<#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<Self, sea_query::ValueTypeErr> {
<#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 {
stringify!(#name).to_owned()
}

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<TokenStream> {
// let ident_span = input.ident.span();

match DeriveValueType::new(input) {
Ok(value_type) => value_type.expand(),
Err(err) => Err(err),
}
}
}

0 comments on commit af071f9

Please sign in to comment.