@@ -3,7 +3,7 @@ use std::collections::BTreeSet;
33use proc_macro2:: TokenStream ;
44use quote:: { format_ident, quote} ;
55
6- use crate :: cli:: { DatabaseKind , Methods } ;
6+ use crate :: cli:: { DatabaseKind , Methods , PoolVisibility } ;
77use crate :: codegen:: entity_parser:: { ParsedEntity , ParsedField } ;
88
99pub fn generate_crud_from_parsed (
@@ -12,6 +12,7 @@ pub fn generate_crud_from_parsed(
1212 entity_module_path : & str ,
1313 methods : & Methods ,
1414 query_macro : bool ,
15+ pool_visibility : PoolVisibility ,
1516) -> ( TokenStream , BTreeSet < String > ) {
1617 let mut imports = BTreeSet :: new ( ) ;
1718
@@ -502,11 +503,17 @@ pub fn generate_crud_from_parsed(
502503 method_tokens. push ( method) ;
503504 }
504505
506+ let pool_vis: TokenStream = match pool_visibility {
507+ PoolVisibility :: Private => quote ! { } ,
508+ PoolVisibility :: Pub => quote ! { pub } ,
509+ PoolVisibility :: PubCrate => quote ! { pub ( crate ) } ,
510+ } ;
511+
505512 let tokens = quote ! {
506513 #( #param_structs) *
507514
508515 pub struct #repo_ident {
509- pool: #pool_type,
516+ #pool_vis pool: #pool_type,
510517 }
511518
512519 impl #repo_ident {
@@ -742,18 +749,18 @@ mod tests {
742749
743750 fn gen ( entity : & ParsedEntity , db : DatabaseKind ) -> String {
744751 let skip = Methods :: all ( ) ;
745- let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , & skip, false ) ;
752+ let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , & skip, false , PoolVisibility :: Private ) ;
746753 parse_and_format ( & tokens)
747754 }
748755
749756 fn gen_macro ( entity : & ParsedEntity , db : DatabaseKind ) -> String {
750757 let skip = Methods :: all ( ) ;
751- let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , & skip, true ) ;
758+ let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , & skip, true , PoolVisibility :: Private ) ;
752759 parse_and_format ( & tokens)
753760 }
754761
755762 fn gen_with_methods ( entity : & ParsedEntity , db : DatabaseKind , methods : & Methods ) -> String {
756- let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , methods, false ) ;
763+ let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::users" , methods, false , PoolVisibility :: Private ) ;
757764 parse_and_format ( & tokens)
758765 }
759766
@@ -777,6 +784,30 @@ mod tests {
777784 assert ! ( code. contains( "pool: sqlx::PgPool" ) || code. contains( "pool: sqlx :: PgPool" ) ) ;
778785 }
779786
787+ #[ test]
788+ fn test_repo_pool_field_pub ( ) {
789+ let skip = Methods :: all ( ) ;
790+ let ( tokens, _) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: Pub ) ;
791+ let code = parse_and_format ( & tokens) ;
792+ assert ! ( code. contains( "pub pool: sqlx::PgPool" ) || code. contains( "pub pool: sqlx :: PgPool" ) ) ;
793+ }
794+
795+ #[ test]
796+ fn test_repo_pool_field_pub_crate ( ) {
797+ let skip = Methods :: all ( ) ;
798+ let ( tokens, _) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: PubCrate ) ;
799+ let code = parse_and_format ( & tokens) ;
800+ assert ! ( code. contains( "pub(crate) pool: sqlx::PgPool" ) || code. contains( "pub(crate) pool: sqlx :: PgPool" ) ) ;
801+ }
802+
803+ #[ test]
804+ fn test_repo_pool_field_private ( ) {
805+ let code = gen ( & standard_entity ( ) , DatabaseKind :: Postgres ) ;
806+ // Should NOT have `pub pool` or `pub(crate) pool`
807+ assert ! ( !code. contains( "pub pool" ) ) ;
808+ assert ! ( !code. contains( "pub(crate) pool" ) ) ;
809+ }
810+
780811 #[ test]
781812 fn test_repo_pool_field_mysql ( ) {
782813 let code = gen ( & standard_entity ( ) , DatabaseKind :: Mysql ) ;
@@ -1117,14 +1148,14 @@ mod tests {
11171148 #[ test]
11181149 fn test_no_pool_import ( ) {
11191150 let skip = Methods :: all ( ) ;
1120- let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false ) ;
1151+ let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: Private ) ;
11211152 assert ! ( !imports. iter( ) . any( |i| i. contains( "PgPool" ) ) ) ;
11221153 }
11231154
11241155 #[ test]
11251156 fn test_imports_contain_entity ( ) {
11261157 let skip = Methods :: all ( ) ;
1127- let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false ) ;
1158+ let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: Private ) ;
11281159 assert ! ( imports. iter( ) . any( |i| i. contains( "crate::models::users::Users" ) ) ) ;
11291160 }
11301161
@@ -1214,15 +1245,15 @@ mod tests {
12141245 ] ,
12151246 } ;
12161247 let skip = Methods :: all ( ) ;
1217- let ( _, imports) = generate_crud_from_parsed ( & entity, DatabaseKind :: Postgres , "crate::models::users" , & skip, false ) ;
1248+ let ( _, imports) = generate_crud_from_parsed ( & entity, DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: Private ) ;
12181249 assert ! ( imports. iter( ) . any( |i| i. contains( "chrono" ) ) ) ;
12191250 assert ! ( imports. iter( ) . any( |i| i. contains( "uuid" ) ) ) ;
12201251 }
12211252
12221253 #[ test]
12231254 fn test_entity_imports_empty_when_no_imports ( ) {
12241255 let skip = Methods :: all ( ) ;
1225- let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false ) ;
1256+ let ( _, imports) = generate_crud_from_parsed ( & standard_entity ( ) , DatabaseKind :: Postgres , "crate::models::users" , & skip, false , PoolVisibility :: Private ) ;
12261257 // Should only have pool + entity imports, no chrono/uuid
12271258 assert ! ( !imports. iter( ) . any( |i| i. contains( "chrono" ) ) ) ;
12281259 assert ! ( !imports. iter( ) . any( |i| i. contains( "uuid" ) ) ) ;
@@ -1343,7 +1374,7 @@ mod tests {
13431374
13441375 fn gen_macro_array ( entity : & ParsedEntity , db : DatabaseKind ) -> String {
13451376 let skip = Methods :: all ( ) ;
1346- let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::agent_connector" , & skip, true ) ;
1377+ let ( tokens, _) = generate_crud_from_parsed ( entity, db, "crate::models::agent_connector" , & skip, true , PoolVisibility :: Private ) ;
13471378 parse_and_format ( & tokens)
13481379 }
13491380
@@ -1426,7 +1457,7 @@ mod tests {
14261457 #[ test]
14271458 fn test_sql_enum_macro_uses_runtime ( ) {
14281459 let skip = Methods :: all ( ) ;
1429- let ( tokens, _) = generate_crud_from_parsed ( & entity_with_sql_enum ( ) , DatabaseKind :: Postgres , "crate::models::task" , & skip, true ) ;
1460+ let ( tokens, _) = generate_crud_from_parsed ( & entity_with_sql_enum ( ) , DatabaseKind :: Postgres , "crate::models::task" , & skip, true , PoolVisibility :: Private ) ;
14301461 let code = parse_and_format ( & tokens) ;
14311462 // SELECT queries should use runtime query_as, not macro
14321463 assert ! ( code. contains( "query_as::<" ) ) ;
@@ -1436,7 +1467,7 @@ mod tests {
14361467 #[ test]
14371468 fn test_sql_enum_macro_delete_still_uses_macro ( ) {
14381469 let skip = Methods :: all ( ) ;
1439- let ( tokens, _) = generate_crud_from_parsed ( & entity_with_sql_enum ( ) , DatabaseKind :: Postgres , "crate::models::task" , & skip, true ) ;
1470+ let ( tokens, _) = generate_crud_from_parsed ( & entity_with_sql_enum ( ) , DatabaseKind :: Postgres , "crate::models::task" , & skip, true , PoolVisibility :: Private ) ;
14401471 let code = parse_and_format ( & tokens) ;
14411472 // DELETE still uses query! macro
14421473 assert ! ( code. contains( "query!" ) ) ;
@@ -1489,15 +1520,15 @@ mod tests {
14891520 #[ test]
14901521 fn test_vec_string_macro_insert_uses_as_slice ( ) {
14911522 let skip = Methods :: all ( ) ;
1492- let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true ) ;
1523+ let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true , PoolVisibility :: Private ) ;
14931524 let code = parse_and_format ( & tokens) ;
14941525 assert ! ( code. contains( "as_slice()" ) ) ;
14951526 }
14961527
14971528 #[ test]
14981529 fn test_vec_string_macro_update_uses_as_slice ( ) {
14991530 let skip = Methods :: all ( ) ;
1500- let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true ) ;
1531+ let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true , PoolVisibility :: Private ) ;
15011532 let code = parse_and_format ( & tokens) ;
15021533 // Should have as_slice() for both insert and update
15031534 let count = code. matches ( "as_slice()" ) . count ( ) ;
@@ -1507,7 +1538,7 @@ mod tests {
15071538 #[ test]
15081539 fn test_vec_string_non_macro_no_as_slice ( ) {
15091540 let skip = Methods :: all ( ) ;
1510- let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, false ) ;
1541+ let ( tokens, _) = generate_crud_from_parsed ( & entity_with_vec_string ( ) , DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, false , PoolVisibility :: Private ) ;
15111542 let code = parse_and_format ( & tokens) ;
15121543 // Runtime mode uses .bind() so no as_slice needed
15131544 assert ! ( !code. contains( "as_slice()" ) ) ;
@@ -1530,7 +1561,7 @@ mod tests {
15301561 "# ;
15311562 let entity = parse_entity_source ( source) . unwrap ( ) ;
15321563 let skip = Methods :: all ( ) ;
1533- let ( tokens, _) = generate_crud_from_parsed ( & entity, DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true ) ;
1564+ let ( tokens, _) = generate_crud_from_parsed ( & entity, DatabaseKind :: Postgres , "crate::models::prompt_history" , & skip, true , PoolVisibility :: Private ) ;
15341565 let code = parse_and_format ( & tokens) ;
15351566 assert ! ( code. contains( "as_slice()" ) , "Expected as_slice() in generated code:\n {}" , code) ;
15361567 }
0 commit comments