Skip to content

Commit 68be4ea

Browse files
committed
Merge remote-tracking branch 'origin/elijah/many-to-many' into elijah/many-to-many
# Conflicts: # cot-macros/src/model.rs
2 parents 8c5ba53 + e563b13 commit 68be4ea

File tree

5 files changed

+32
-23
lines changed

5 files changed

+32
-23
lines changed

cot-codegen/src/model.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ impl FieldOpts {
225225
}
226226
Err(_) => None,
227227
};
228-
228+
229229
let is_primary_key = self.primary_key.is_present();
230230
let mut resolved_ty = self.ty.clone();
231231
symbol_resolver.resolve(&mut resolved_ty, self_reference);
@@ -325,8 +325,7 @@ impl TryFrom<syn::Type> for ForeignKeySpec {
325325
}
326326
}
327327

328-
329-
use syn::{Type, TypePath, TypeReference, TypeParen, TypeGroup};
328+
use syn::{Type, TypeGroup, TypeParen, TypePath, TypeReference};
330329

331330
#[derive(Debug, Clone, FromMeta, Default, PartialEq, Eq, Hash)]
332331
pub struct ManyToManyOpts {
@@ -352,7 +351,10 @@ impl TryFrom<syn::Type> for ManyToManySpec {
352351

353352
fn try_from(ty: syn::Type) -> Result<Self, Self::Error> {
354353
let syn::Type::Path(type_path) = &ty else {
355-
return Err(syn::Error::new(ty.span(), "expected a path type for ManyToMany"));
354+
return Err(syn::Error::new(
355+
ty.span(),
356+
"expected a path type for ManyToMany",
357+
));
356358
};
357359

358360
let seg = type_path
@@ -384,22 +386,27 @@ impl TryFrom<syn::Type> for ManyToManySpec {
384386
let inner_ty = if let syn::GenericArgument::Type(inner_ty) = inner {
385387
inner_ty
386388
} else {
387-
return Err(syn::Error::new(ty.span(), "expected a type generic argument"));
389+
return Err(syn::Error::new(
390+
ty.span(),
391+
"expected a type generic argument",
392+
));
388393
};
389394

390395
fn type_to_snake_name(ty: &Type) -> Option<String> {
391396
match ty {
392-
Type::Path(TypePath { path, .. }) => {
393-
path.segments.last().map(|seg| seg.ident.to_string().to_snake_case())
394-
}
397+
Type::Path(TypePath { path, .. }) => path
398+
.segments
399+
.last()
400+
.map(|seg| seg.ident.to_string().to_snake_case()),
395401
Type::Reference(TypeReference { elem, .. }) => type_to_snake_name(&*elem),
396402
Type::Paren(TypeParen { elem, .. }) => type_to_snake_name(&*elem),
397403
Type::Group(TypeGroup { elem, .. }) => type_to_snake_name(&*elem),
398404
_ => None,
399405
}
400406
}
401-
402-
let target_table_name = type_to_snake_name(inner_ty).expect("Could not determine target table name from ManyToMany inner type");
407+
408+
let target_table_name = type_to_snake_name(inner_ty)
409+
.expect("Could not determine target table name from ManyToMany inner type");
403410

404411
Ok(ManyToManySpec {
405412
to_model: inner_ty.clone(),

cot-macros/src/model.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use proc_macro2::Literal;
21
use cot_codegen::model::{Field, ManyToManySpec, Model, ModelArgs, ModelOpts, ModelType};
32
use cot_codegen::symbol_resolver::{SymbolResolver, VisibleSymbol, VisibleSymbolKind};
43
use darling::FromMeta;
54
use darling::ast::NestedMeta;
65
use heck::ToSnakeCase;
6+
use proc_macro2::Literal;
77
use proc_macro2::{Ident, TokenStream};
88
use quote::{ToTokens, TokenStreamExt, format_ident, quote};
99
use syn::Token;
@@ -83,7 +83,7 @@ struct ModelBuilder {
8383
fields_as_update_from_db: Vec<TokenStream>,
8484
fields_as_get_values: Vec<TokenStream>,
8585
fields_as_field_refs: Vec<TokenStream>,
86-
fields_as_m2m_consts: Vec<TokenStream>
86+
fields_as_m2m_consts: Vec<TokenStream>,
8787
}
8888

8989
impl ToTokens for ModelBuilder {
@@ -118,7 +118,7 @@ impl ModelBuilder {
118118
fields_as_update_from_db: Vec::with_capacity(field_count),
119119
fields_as_get_values: Vec::with_capacity(field_count),
120120
fields_as_field_refs: Vec::with_capacity(field_count),
121-
fields_as_m2m_consts: Vec::with_capacity(field_count)
121+
fields_as_m2m_consts: Vec::with_capacity(field_count),
122122
};
123123
for field in &model.fields {
124124
model_builder.push_field(field);
@@ -194,12 +194,9 @@ impl ModelBuilder {
194194
));
195195
}
196196

197-
fn infer_m2m_names(
198-
&self,
199-
field: &Field,
200-
m2m: &ManyToManySpec,
201-
) -> (String, String, String) {
202-
let owner_table = self.table_name.clone();
197+
fn infer_m2m_names(&self, field: &Field, m2m: &ManyToManySpec) -> (String, String, String) {
198+
// owner table as available in ModelBuilder
199+
let owner_table = self.table_name.clone(); // already snake-cased + app namespace if needed
203200
let owner_pk_col = self.pk_field.column_name.clone();
204201

205202
let target_table = m2m.target_table_name.clone();

cot/src/db.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ use derive_more::{Debug, Deref, Display};
2727
#[cfg(test)]
2828
use mockall::automock;
2929
use query::Query;
30-
pub use relations::{ForeignKey, ForeignKeyOnDeletePolicy, ForeignKeyOnUpdatePolicy, ManyToMany, ManyToManyField};
30+
pub use relations::{
31+
ForeignKey, ForeignKeyOnDeletePolicy, ForeignKeyOnUpdatePolicy, ManyToMany, ManyToManyField,
32+
};
3133
use sea_query::{
3234
ColumnRef, Iden, IntoColumnRef, OnConflict, ReturningClause, SchemaStatementBuilder, SimpleExpr,
3335
};

cot/src/db/fields.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use crate::db::impl_mysql::MySqlValueRef;
66
use crate::db::impl_postgres::PostgresValueRef;
77
#[cfg(feature = "sqlite")]
88
use crate::db::impl_sqlite::SqliteValueRef;
9-
use crate::db::{Auto, ColumnType, DatabaseError, DatabaseField, DbFieldValue, DbValue, ForeignKey, FromDbValue, LimitedString, ManyToMany, Model, PrimaryKey, Result, SqlxValueRef, ToDbFieldValue, ToDbValue};
9+
use crate::db::{
10+
Auto, ColumnType, DatabaseError, DatabaseField, DbFieldValue, DbValue, ForeignKey, FromDbValue,
11+
LimitedString, ManyToMany, Model, PrimaryKey, Result, SqlxValueRef, ToDbFieldValue, ToDbValue,
12+
};
1013

1114
mod chrono_wrapper;
1215

cot/src/db/relations.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ impl<T: Model> Default for ManyToMany<T> {
208208
ManyToMany::PrimaryKeys(Vec::new())
209209
}
210210
}
211-
impl <T: Model> ManyToMany<T> {
211+
impl<T: Model> ManyToMany<T> {
212212
pub fn primary_keys(&self) -> Vec<&T::PrimaryKey> {
213213
match self {
214214
Self::PrimaryKeys(pks) => pks.iter().collect(),
@@ -232,7 +232,7 @@ pub struct ManyToManyField<T: Model, Owner: Model> {
232232
pub phantom: std::marker::PhantomData<(T, Owner)>,
233233
}
234234

235-
impl <T: Model, Owner: Model> ManyToManyField<T, Owner> {
235+
impl<T: Model, Owner: Model> ManyToManyField<T, Owner> {
236236
pub const fn new(
237237
join_table: &'static str,
238238
owner_field: &'static str,

0 commit comments

Comments
 (0)