Customize column names

This commit is contained in:
Billy Chan 2021-08-12 19:07:03 +08:00 committed by Chris Tsang
parent 106d38d20b
commit 8b30ef74a2
6 changed files with 42 additions and 13 deletions

View File

@ -33,7 +33,7 @@ chrono = { version = "^0", optional = true }
futures = { version = "^0.3" } futures = { version = "^0.3" }
futures-util = { version = "^0.3" } futures-util = { version = "^0.3" }
rust_decimal = { version = "^1", optional = true } rust_decimal = { version = "^1", optional = true }
sea-orm-macros = { version = "^0.1", optional = true } sea-orm-macros = { version = "^0.1", path = "sea-orm-macros", optional = true }
sea-query = { version = "^0.12.8" } sea-query = { version = "^0.12.8" }
sea-strum = { version = "^0.21", features = ["derive", "sea-orm"] } sea-strum = { version = "^0.21", features = ["derive", "sea-orm"] }
serde = { version = "^1.0", features = ["derive"] } serde = { version = "^1.0", features = ["derive"] }

View File

@ -3,7 +3,7 @@ use proc_macro2::{Ident, TokenStream};
use quote::{quote, quote_spanned}; use quote::{quote, quote_spanned};
use syn::{Data, DataEnum, Fields, Variant}; use syn::{Data, DataEnum, Fields, Variant};
pub fn expand_derive_column(ident: Ident, data: Data) -> syn::Result<TokenStream> { pub fn expand_derive_column(ident: &Ident, data: &Data) -> syn::Result<TokenStream> {
let variants = match data { let variants = match data {
syn::Data::Enum(DataEnum { variants, .. }) => variants, syn::Data::Enum(DataEnum { variants, .. }) => variants,
_ => { _ => {
@ -30,12 +30,10 @@ pub fn expand_derive_column(ident: Ident, data: Data) -> syn::Result<TokenStream
}) })
.collect(); .collect();
let impl_iden = expand_derive_custom_column(ident)?;
Ok(quote!( Ok(quote!(
impl sea_orm::Iden for #ident { #impl_iden
fn unquoted(&self, s: &mut dyn std::fmt::Write) {
write!(s, "{}", self.as_str()).unwrap();
}
}
impl sea_orm::IdenStatic for #ident { impl sea_orm::IdenStatic for #ident {
fn as_str(&self) -> &str { fn as_str(&self) -> &str {
@ -46,3 +44,13 @@ pub fn expand_derive_column(ident: Ident, data: Data) -> syn::Result<TokenStream
} }
)) ))
} }
pub fn expand_derive_custom_column(ident: &Ident) -> syn::Result<TokenStream> {
Ok(quote!(
impl sea_orm::Iden for #ident {
fn unquoted(&self, s: &mut dyn std::fmt::Write) {
write!(s, "{}", self.as_str()).unwrap();
}
}
))
}

View File

@ -29,7 +29,17 @@ pub fn derive_primary_key(input: TokenStream) -> TokenStream {
pub fn derive_column(input: TokenStream) -> TokenStream { pub fn derive_column(input: TokenStream) -> TokenStream {
let DeriveInput { ident, data, .. } = parse_macro_input!(input); let DeriveInput { ident, data, .. } = parse_macro_input!(input);
match derives::expand_derive_column(ident, data) { match derives::expand_derive_column(&ident, &data) {
Ok(ts) => ts.into(),
Err(e) => e.to_compile_error().into(),
}
}
#[proc_macro_derive(DeriveCustomColumn)]
pub fn derive_custom_column(input: TokenStream) -> TokenStream {
let DeriveInput { ident, .. } = parse_macro_input!(input);
match derives::expand_derive_custom_column(&ident) {
Ok(ts) => ts.into(), Ok(ts) => ts.into(),
Err(e) => e.to_compile_error().into(), Err(e) => e.to_compile_error().into(),
} }

View File

@ -1,7 +1,7 @@
pub use crate::{ pub use crate::{
error::*, ActiveModelBehavior, ActiveModelTrait, ColumnDef, ColumnTrait, ColumnType, error::*, ActiveModelBehavior, ActiveModelTrait, ColumnDef, ColumnTrait, ColumnType,
DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveEntity, DeriveModel, DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveCustomColumn, DeriveEntity,
DerivePrimaryKey, EntityName, EntityTrait, EnumIter, Iden, IdenStatic, ModelTrait, DeriveModel, DerivePrimaryKey, EntityName, EntityTrait, EnumIter, Iden, IdenStatic, ModelTrait,
PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, QueryResult, Related, RelationDef, PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, QueryResult, Related, RelationDef,
RelationTrait, Select, Value, RelationTrait, Select, Value,
}; };

View File

@ -219,8 +219,8 @@ pub use executor::*;
pub use query::*; pub use query::*;
pub use sea_orm_macros::{ pub use sea_orm_macros::{
DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveEntity, DeriveModel, DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveCustomColumn, DeriveEntity,
DerivePrimaryKey, FromQueryResult, DeriveModel, DerivePrimaryKey, FromQueryResult,
}; };
pub use sea_query; pub use sea_query;

View File

@ -16,12 +16,23 @@ pub struct Model {
pub name: String, pub name: String,
} }
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] // If your column names are not in snake-case, derive `DeriveCustomColumn` here.
#[derive(Copy, Clone, Debug, EnumIter, DeriveCustomColumn)]
pub enum Column { pub enum Column {
Id, Id,
Name, Name,
} }
// Then, customize each column names here.
impl IdenStatic for Column {
fn as_str(&self) -> &str {
match self {
Self::Id => "id",
Self::Name => "name",
}
}
}
#[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] #[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)]
pub enum PrimaryKey { pub enum PrimaryKey {
Id, Id,