Skip to content

Commit 5154ee7

Browse files
committed
fix: import cleanup
1 parent cbf9576 commit 5154ee7

File tree

7 files changed

+314
-166
lines changed

7 files changed

+314
-166
lines changed

src/common/builder_factory.rs

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
//! create a factory pattern for generating query builders.
55
66
use proc_macro2::TokenStream;
7-
use syn::DeriveInput;
87
use quote::quote;
8+
use syn::DeriveInput;
99

10-
use crate::common::query_builder_gen::{QueryBuilderGenerator, QueryType};
11-
use crate::common::modern_builders::ModernManyQueryBuilder;
1210
use crate::common::field_analysis::analyze_struct_fields;
11+
use crate::common::modern_builders::ModernManyQueryBuilder;
12+
use crate::common::query_builder_gen::{QueryBuilderGenerator, QueryType};
1313

1414
/// Factory for creating different types of query builders
1515
pub struct QueryBuilderFactory;
@@ -38,7 +38,7 @@ impl QueryBuilderFactory {
3838
/// Generate all query builders for a struct
3939
pub fn generate_all_builders(input: &DeriveInput) -> TokenStream {
4040
let many_builder = Self::generate_builder(QueryType::Many, input);
41-
41+
4242
// In a complete implementation, we'd generate all builder types
4343
quote! {
4444
#many_builder
@@ -50,24 +50,48 @@ impl QueryBuilderFactory {
5050
pub fn analyze_query_capabilities(input: &DeriveInput) -> String {
5151
let fields = analyze_struct_fields(input);
5252
let mut report = String::new();
53-
53+
5454
report.push_str(&format!("Query capabilities for {}:\n", input.ident));
5555
report.push_str(&format!(" Total fields: {}\n", fields.len()));
56-
56+
5757
let key_fields: Vec<_> = fields.iter().filter(|f| f.is_key).collect();
5858
let unique_fields: Vec<_> = fields.iter().filter(|f| f.is_unique).collect();
5959
let auto_fields: Vec<_> = fields.iter().filter(|f| f.is_auto).collect();
6060
let enum_fields: Vec<_> = fields.iter().filter(|f| f.is_custom_enum).collect();
61-
62-
report.push_str(&format!(" Key fields: {} ({:?})\n", key_fields.len(),
63-
key_fields.iter().map(|f| f.name.to_string()).collect::<Vec<_>>()));
64-
report.push_str(&format!(" Unique fields: {} ({:?})\n", unique_fields.len(),
65-
unique_fields.iter().map(|f| f.name.to_string()).collect::<Vec<_>>()));
66-
report.push_str(&format!(" Auto fields: {} ({:?})\n", auto_fields.len(),
67-
auto_fields.iter().map(|f| f.name.to_string()).collect::<Vec<_>>()));
68-
report.push_str(&format!(" Enum fields: {} ({:?})\n", enum_fields.len(),
69-
enum_fields.iter().map(|f| f.name.to_string()).collect::<Vec<_>>()));
70-
61+
62+
report.push_str(&format!(
63+
" Key fields: {} ({:?})\n",
64+
key_fields.len(),
65+
key_fields
66+
.iter()
67+
.map(|f| f.name.to_string())
68+
.collect::<Vec<_>>()
69+
));
70+
report.push_str(&format!(
71+
" Unique fields: {} ({:?})\n",
72+
unique_fields.len(),
73+
unique_fields
74+
.iter()
75+
.map(|f| f.name.to_string())
76+
.collect::<Vec<_>>()
77+
));
78+
report.push_str(&format!(
79+
" Auto fields: {} ({:?})\n",
80+
auto_fields.len(),
81+
auto_fields
82+
.iter()
83+
.map(|f| f.name.to_string())
84+
.collect::<Vec<_>>()
85+
));
86+
report.push_str(&format!(
87+
" Enum fields: {} ({:?})\n",
88+
enum_fields.len(),
89+
enum_fields
90+
.iter()
91+
.map(|f| f.name.to_string())
92+
.collect::<Vec<_>>()
93+
));
94+
7195
report
7296
}
7397
}
@@ -84,10 +108,11 @@ pub struct ManyQueryValidator;
84108
impl QueryBuilderValidator for ManyQueryValidator {
85109
fn validate(&self, input: &DeriveInput) -> Result<(), String> {
86110
let fields = analyze_struct_fields(input);
87-
let non_key_unique_fields: Vec<_> = fields.iter()
111+
let non_key_unique_fields: Vec<_> = fields
112+
.iter()
88113
.filter(|f| !f.is_key && !f.is_unique)
89114
.collect();
90-
115+
91116
if non_key_unique_fields.is_empty() {
92117
Err(format!(
93118
"Struct {} has no non-key, non-unique fields available for many queries",
@@ -130,17 +155,17 @@ mod tests {
130155
#[test]
131156
fn test_many_query_validation() {
132157
let validator = ManyQueryValidator;
133-
158+
134159
let valid_input: DeriveInput = parse_quote! {
135160
pub struct User {
136161
#[key]
137162
id: String,
138163
name: String,
139164
}
140165
};
141-
166+
142167
assert!(validator.validate(&valid_input).is_ok());
143-
168+
144169
let invalid_input: DeriveInput = parse_quote! {
145170
pub struct User {
146171
#[key]
@@ -149,7 +174,7 @@ mod tests {
149174
email: String,
150175
}
151176
};
152-
177+
153178
assert!(validator.validate(&invalid_input).is_err());
154179
}
155180
}

src/common/config.rs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44
//! customization of query generation behavior.
55
66
use std::collections::HashMap;
7-
use proc_macro2::Ident;
87
use syn::DeriveInput;
98

10-
use crate::common::query_builder_gen::QueryType;
119
use crate::common::field_analysis::FieldAnalysis;
10+
use crate::common::query_builder_gen::QueryType;
1211

1312
/// Configuration options for customizing query generation
1413
#[derive(Clone, Debug)]
@@ -124,8 +123,14 @@ impl DbSetConfigBuilder {
124123
self
125124
}
126125

127-
pub fn field_override<S: Into<String>>(mut self, field_name: S, override_config: FieldOverride) -> Self {
128-
self.config.field_overrides.insert(field_name.into(), override_config);
126+
pub fn field_override<S: Into<String>>(
127+
mut self,
128+
field_name: S,
129+
override_config: FieldOverride,
130+
) -> Self {
131+
self.config
132+
.field_overrides
133+
.insert(field_name.into(), override_config);
129134
self
130135
}
131136

@@ -148,7 +153,7 @@ impl Default for DbSetConfigBuilder {
148153
/// Extract configuration from derive input attributes
149154
pub fn extract_config_from_attributes(input: &DeriveInput) -> DbSetConfig {
150155
let mut config = DbSetConfig::default();
151-
156+
152157
// Look for #[dbset(...)] attributes
153158
for attr in &input.attrs {
154159
if let syn::Meta::List(meta) = &attr.meta {
@@ -184,28 +189,31 @@ pub fn extract_config_from_attributes(input: &DeriveInput) -> DbSetConfig {
184189
}
185190
}
186191
}
187-
192+
188193
config
189194
}
190195

191196
/// Apply configuration-based field filtering
192197
pub fn apply_config_field_filter<'a>(
193-
fields: &'a [FieldAnalysis],
194-
config: &DbSetConfig,
195-
query_type: QueryType
198+
fields: &'a [FieldAnalysis],
199+
config: &DbSetConfig,
200+
query_type: QueryType,
196201
) -> Vec<&'a FieldAnalysis> {
197-
fields.iter().filter(|field| {
198-
let field_name = field.name.to_string();
199-
200-
// Check if field is excluded from this query type
201-
if let Some(override_config) = config.field_overrides.get(&field_name) {
202-
if override_config.exclude_from.contains(&query_type) {
203-
return false;
202+
fields
203+
.iter()
204+
.filter(|field| {
205+
let field_name = field.name.to_string();
206+
207+
// Check if field is excluded from this query type
208+
if let Some(override_config) = config.field_overrides.get(&field_name) {
209+
if override_config.exclude_from.contains(&query_type) {
210+
return false;
211+
}
204212
}
205-
}
206-
207-
true
208-
}).collect()
213+
214+
true
215+
})
216+
.collect()
209217
}
210218

211219
#[cfg(test)]
@@ -245,7 +253,7 @@ mod tests {
245253
#[test]
246254
fn test_field_filtering() {
247255
use crate::common::field_analysis::analyze_struct_fields;
248-
256+
249257
let input: DeriveInput = parse_quote! {
250258
pub struct User {
251259
id: String,
@@ -256,21 +264,21 @@ mod tests {
256264

257265
let fields = analyze_struct_fields(&input);
258266
let mut config = DbSetConfig::default();
259-
267+
260268
// Exclude 'email' field from Many queries
261269
config.field_overrides.insert(
262-
"email".to_string(),
270+
"email".to_string(),
263271
FieldOverride {
264272
column_name: None,
265273
sql_type: None,
266274
exclude_from: vec![QueryType::Many],
267275
validation_rules: vec![],
268-
}
276+
},
269277
);
270278

271279
let filtered = apply_config_field_filter(&fields, &config, QueryType::Many);
272280
let field_names: Vec<_> = filtered.iter().map(|f| f.name.to_string()).collect();
273-
281+
274282
assert!(!field_names.contains(&"email".to_string()));
275283
assert!(field_names.contains(&"name".to_string()));
276284
}

src/common/demo.rs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
//! See the tests folder for realistic consumer usage examples.
1313
1414
use proc_macro2::TokenStream;
15-
use syn::DeriveInput;
1615
use quote::quote;
16+
use syn::DeriveInput;
1717

1818
use crate::common::{
19-
config::{DbSetConfigBuilder, extract_config_from_attributes},
2019
builder_factory::QueryBuilderFactory,
21-
query_builder_gen::QueryType,
20+
config::{extract_config_from_attributes, DbSetConfigBuilder},
2221
field_analysis::analyze_struct_fields,
22+
query_builder_gen::QueryType,
2323
};
2424

2525
/// Demonstrates the usage of the new advanced system
@@ -30,23 +30,27 @@ impl AdvancedQueryBuilderDemo {
3030
pub fn generate_with_config(input: &DeriveInput) -> TokenStream {
3131
// Extract configuration from attributes
3232
let base_config = extract_config_from_attributes(input);
33-
33+
3434
// Enhance with additional settings
3535
let _enhanced_config = DbSetConfigBuilder::new()
36-
.table_name(base_config.table_name.unwrap_or_else(|| input.ident.to_string().to_lowercase()))
36+
.table_name(
37+
base_config
38+
.table_name
39+
.unwrap_or_else(|| input.ident.to_string().to_lowercase()),
40+
)
3741
.include_validation(true)
3842
.async_methods(true)
3943
.build();
4044

4145
// Analyze the struct capabilities
4246
let analysis_report = QueryBuilderFactory::analyze_query_capabilities(input);
43-
47+
4448
// Generate comment with analysis
4549
let analysis_comment = format!("/*\n{}\n*/", analysis_report);
46-
50+
4751
// Generate the query builders
4852
let many_builder = QueryBuilderFactory::generate_builder(QueryType::Many, input);
49-
53+
5054
quote! {
5155
#[doc = #analysis_comment]
5256
#many_builder
@@ -101,12 +105,16 @@ impl ECommerceQueryBuilders {
101105
/// (For illustration only; not typical usage)
102106
pub fn generate_product_builders(input: &DeriveInput) -> TokenStream {
103107
let fields = analyze_struct_fields(input);
104-
108+
105109
// Look for e-commerce specific fields
106110
let has_price = fields.iter().any(|f| f.name.to_string().contains("price"));
107-
let has_inventory = fields.iter().any(|f| f.name.to_string().contains("inventory") || f.name.to_string().contains("stock"));
108-
let has_category = fields.iter().any(|f| f.name.to_string().contains("category"));
109-
111+
let has_inventory = fields.iter().any(|f| {
112+
f.name.to_string().contains("inventory") || f.name.to_string().contains("stock")
113+
});
114+
let has_category = fields
115+
.iter()
116+
.any(|f| f.name.to_string().contains("category"));
117+
110118
let specialized_methods = if has_price && has_inventory && has_category {
111119
quote! {
112120
impl ProductSpecializedQueries {
@@ -178,10 +186,10 @@ mod tests {
178186

179187
let result = AdvancedQueryBuilderDemo::generate_with_config(&input);
180188
let result_str = result.to_string();
181-
189+
182190
// Should contain analysis comment
183191
assert!(result_str.contains("Query capabilities"));
184-
192+
185193
// Should contain query builder
186194
assert!(result_str.contains("QueryBuilder"));
187195
}
@@ -200,7 +208,7 @@ mod tests {
200208

201209
let result = ECommerceQueryBuilders::generate_product_builders(&product_input);
202210
let result_str = result.to_string();
203-
211+
204212
// Should contain specialized methods
205213
assert!(result_str.contains("find_by_price_range"));
206214
assert!(result_str.contains("find_low_stock"));

src/common/field_analysis.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
//! for different query generation purposes.
55
66
use proc_macro2::Ident;
7-
use syn::{Attribute, Type, DeriveInput};
7+
use syn::{Attribute, DeriveInput, Type};
88

9-
use crate::common::utils::{
10-
get_all_fields, is_custom_enum_attr, get_inner_option_type,
11-
};
9+
use crate::common::utils::{get_all_fields, get_inner_option_type, is_custom_enum_attr};
1210

1311
/// Represents a field with its metadata for query generation
1412
#[derive(Clone)]
@@ -69,7 +67,7 @@ impl FieldAnalysis {
6967
/// Analyze all fields in a struct and categorize them
7068
pub fn analyze_struct_fields(input: &DeriveInput) -> Vec<FieldAnalysis> {
7169
let all_fields = get_all_fields(input);
72-
70+
7371
all_fields
7472
.iter()
7573
.map(|(name, field_type, attributes)| {
@@ -80,7 +78,10 @@ pub fn analyze_struct_fields(input: &DeriveInput) -> Vec<FieldAnalysis> {
8078

8179
/// Get fields suitable for many queries (excluding keys and unique fields)
8280
pub fn get_many_query_fields(analyses: &[FieldAnalysis]) -> Vec<&FieldAnalysis> {
83-
analyses.iter().filter(|f| f.is_many_query_field()).collect()
81+
analyses
82+
.iter()
83+
.filter(|f| f.is_many_query_field())
84+
.collect()
8485
}
8586

8687
/// Get fields suitable for one queries (keys and unique fields)

0 commit comments

Comments
 (0)