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-util = { version = "^0.3" }
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-strum = { version = "^0.21", features = ["derive", "sea-orm"] }
serde = { version = "^1.0", features = ["derive"] }

View File

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

View File

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

View File

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

View File

@ -16,12 +16,23 @@ pub struct Model {
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 {
Id,
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)]
pub enum PrimaryKey {
Id,