diff options
| author | mo khan <mo@mokhan.ca> | 2025-09-25 09:29:51 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-09-25 09:29:51 -0600 |
| commit | 4d2898752913d92caabbb78434fbfabb4fff199f (patch) | |
| tree | c18048a493a5729b7dcd8f2f9fde0ad3f7442584 | |
| parent | 6c5934dcd86b9f9efba4368f7183557106df0973 (diff) | |
refactor: cleanup
| -rw-r--r-- | src/formatter.rs | 164 | ||||
| -rw-r--r-- | tests/fixtures/invalid_sql/input.sql | 1 | ||||
| -rw-r--r-- | tests/fixtures/invalid_sql/output.sql | 1 | ||||
| -rw-r--r-- | tests/fixtures/invalid_sql_passthrough/input.sql | 1 | ||||
| -rw-r--r-- | tests/fixtures/invalid_sql_passthrough/output.sql | 1 | ||||
| -rw-r--r-- | tests/integration.rs | 59 |
6 files changed, 31 insertions, 196 deletions
diff --git a/src/formatter.rs b/src/formatter.rs index b12ab03..c6f3dbc 100644 --- a/src/formatter.rs +++ b/src/formatter.rs @@ -16,7 +16,7 @@ pub fn format_statement(statement: &Statement, indent_level: usize) -> String { Statement::Delete { .. } => { // TODO: Fix DELETE statement formatting for new API "DELETE statement".to_string() - }, + } Statement::CreateTable { .. } => { // TODO: Fix CREATE TABLE statement formatting for new API "CREATE TABLE statement".to_string() @@ -225,16 +225,14 @@ fn format_select_item(item: &SelectItem) -> String { SelectItem::ExprWithAlias { expr, alias } => { format!("{} AS {}", format_expr(expr), alias.value) } - SelectItem::QualifiedWildcard(kind, _) => { - match kind { - SelectItemQualifiedWildcardKind::ObjectName(object_name) => { - format!("{}.*", object_name) - } - SelectItemQualifiedWildcardKind::Expr(expr) => { - format!("{}.*", format_expr(expr)) - } + SelectItem::QualifiedWildcard(kind, _) => match kind { + SelectItemQualifiedWildcardKind::ObjectName(object_name) => { + format!("{}.*", object_name) } - } + SelectItemQualifiedWildcardKind::Expr(expr) => { + format!("{}.*", format_expr(expr)) + } + }, SelectItem::Wildcard(_) => "*".to_string(), } } @@ -366,7 +364,8 @@ fn format_expr(expr: &Expr) -> String { Expr::Case { operand, conditions, - else_result, .. + else_result, + .. } => format_case_expr_new(operand, conditions, else_result), Expr::Function(function) => format_function(function), Expr::Subquery(query) => { @@ -459,35 +458,6 @@ fn format_case_expr_new( result } -fn format_case_expr( - operand: &Option<Box<Expr>>, - conditions: &[Expr], - results: &[Expr], - else_result: &Option<Box<Expr>>, -) -> String { - let mut result = String::new(); - - result.push_str("CASE"); - if let Some(operand) = operand { - result.push_str(&format!(" {}", format_expr(operand))); - } - - for (condition, case_result) in conditions.iter().zip(results.iter()) { - result.push_str(&format!( - "\n WHEN {} THEN {}", - format_expr(condition), - format_expr(case_result) - )); - } - - if let Some(else_result) = else_result { - result.push_str(&format!("\n ELSE {}", format_expr(else_result))); - } - - result.push_str("\nEND"); - result -} - fn format_function(function: &Function) -> String { let mut result = function.name.to_string().to_uppercase(); result.push('('); @@ -501,8 +471,10 @@ fn format_function(function: &Function) -> String { let args: Vec<String> = match &function.args { FunctionArguments::None => vec![], FunctionArguments::Subquery(_) => vec!["SUBQUERY".to_string()], - FunctionArguments::List(list) => { - list.args.iter().map(|arg| match arg { + FunctionArguments::List(list) => list + .args + .iter() + .map(|arg| match arg { FunctionArg::Named { name, arg, .. } => { format!("{} => {}", name.value, format_function_arg_expr(arg)) } @@ -510,8 +482,8 @@ fn format_function(function: &Function) -> String { FunctionArg::ExprNamed { name, arg, .. } => { format!("{} => {}", format_expr(name), format_function_arg_expr(arg)) } - }).collect() - } + }) + .collect(), }; result.push_str(&args.join(", ")); @@ -561,28 +533,6 @@ fn format_order_by_expr(order: &OrderByExpr) -> String { result } -fn format_insert( - table_name: &ObjectName, - columns: &[Ident], - source: &Query, - indent_level: usize, -) -> String { - let mut result = format!("{}INSERT INTO {}", " ".repeat(indent_level), table_name); - - if !columns.is_empty() { - result.push(' '); - result.push('('); - let column_names: Vec<String> = columns.iter().map(|col| col.value.clone()).collect(); - result.push_str(&column_names.join(", ")); - result.push(')'); - } - - result.push('\n'); - result.push_str(&format_query(source, indent_level)); - - result -} - fn format_update( table: &TableWithJoins, assignments: &[Assignment], @@ -627,88 +577,6 @@ fn format_update( result } -fn format_delete(from: &FromTable, selection: &Option<Expr>, indent_level: usize) -> String { - let mut result = format!("{}DELETE FROM", " ".repeat(indent_level)); - - match from { - FromTable::WithFromKeyword(tables) => { - for (i, table) in tables.iter().enumerate() { - if i == 0 { - result.push('\n'); - } else { - result.push_str(",\n"); - } - result.push_str(&format!( - "{} {}", - " ".repeat(indent_level), - format_table_with_joins(table, indent_level + 2) - )); - } - } - FromTable::WithoutKeyword(tables) => { - for (i, table) in tables.iter().enumerate() { - if i == 0 { - result.push(' '); - } else { - result.push_str(", "); - } - result.push_str(&format_table_with_joins(table, indent_level)); - } - } - } - - if let Some(selection) = selection { - result.push('\n'); - result.push_str(&format!( - "{}WHERE {}", - " ".repeat(indent_level), - format_expr(selection) - )); - } - - result -} - -fn format_create_table(name: &ObjectName, columns: &[ColumnDef], indent_level: usize) -> String { - let mut result = format!("{}CREATE TABLE {} (", " ".repeat(indent_level), name); - - for (i, column) in columns.iter().enumerate() { - if i == 0 { - result.push('\n'); - } else { - result.push_str(",\n"); - } - result.push_str(&format!( - "{} {} {}", - " ".repeat(indent_level), - column.name.value, - column.data_type - )); - - for option in &column.options { - match option.option { - ColumnOption::NotNull => result.push_str(" NOT NULL"), - ColumnOption::Null => result.push_str(" NULL"), - ColumnOption::Default(ref expr) => { - result.push_str(&format!(" DEFAULT {}", format_expr(expr))) - } - ColumnOption::Unique { is_primary, .. } => { - if is_primary { - result.push_str(" PRIMARY KEY"); - } else { - result.push_str(" UNIQUE"); - } - } - _ => {} - } - } - } - - result.push('\n'); - result.push_str(&format!("{})", " ".repeat(indent_level))); - result -} - fn is_simple_projection(item: &SelectItem) -> bool { match item { SelectItem::UnnamedExpr(expr) => is_simple_expr(expr), diff --git a/tests/fixtures/invalid_sql/input.sql b/tests/fixtures/invalid_sql/input.sql deleted file mode 100644 index ba127c3..0000000 --- a/tests/fixtures/invalid_sql/input.sql +++ /dev/null @@ -1 +0,0 @@ -INVALID SQL SYNTAX HERE
\ No newline at end of file diff --git a/tests/fixtures/invalid_sql/output.sql b/tests/fixtures/invalid_sql/output.sql deleted file mode 100644 index ba127c3..0000000 --- a/tests/fixtures/invalid_sql/output.sql +++ /dev/null @@ -1 +0,0 @@ -INVALID SQL SYNTAX HERE
\ No newline at end of file diff --git a/tests/fixtures/invalid_sql_passthrough/input.sql b/tests/fixtures/invalid_sql_passthrough/input.sql deleted file mode 100644 index 004b5b7..0000000 --- a/tests/fixtures/invalid_sql_passthrough/input.sql +++ /dev/null @@ -1 +0,0 @@ -INVALID SQL SYNTAX
\ No newline at end of file diff --git a/tests/fixtures/invalid_sql_passthrough/output.sql b/tests/fixtures/invalid_sql_passthrough/output.sql deleted file mode 100644 index 004b5b7..0000000 --- a/tests/fixtures/invalid_sql_passthrough/output.sql +++ /dev/null @@ -1 +0,0 @@ -INVALID SQL SYNTAX
\ No newline at end of file diff --git a/tests/integration.rs b/tests/integration.rs index 869532b..2ac4e91 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -24,52 +24,23 @@ fn discover_fixtures() -> Vec<PathBuf> { fixtures } -fn run_fixture_test(fixture_path: &Path) { - let scenario_name = fixture_path.file_name().unwrap().to_str().unwrap(); - - let input_file = fixture_path.join("input.sql"); - let output_file = fixture_path.join("output.sql"); - - let input_sql = fs::read_to_string(&input_file) - .unwrap_or_else(|_| panic!("Failed to read input file: {}", input_file.display())); - - let expected_output = fs::read_to_string(&output_file) - .unwrap_or_else(|_| panic!("Failed to read output file: {}", output_file.display())); - - let mut cmd = Command::cargo_bin("xlg-sqlfmt").unwrap(); - - if scenario_name == "invalid_sql" || scenario_name == "invalid_sql_passthrough" { - cmd.write_stdin(input_sql.as_str()) - .assert() - .failure() - .stdout(format!("{}\n", expected_output)); - } else if scenario_name == "empty_input" || scenario_name == "whitespace_only" { - cmd.write_stdin(input_sql.as_str()) - .assert() - .success() - .stdout(expected_output); - } else { +#[test] +fn test_all_fixtures() { + for fixture_path in discover_fixtures() { + let input_file = fixture_path.join("input.sql"); + let output_file = fixture_path.join("output.sql"); + let input_sql = fs::read_to_string(&input_file).expect(""); + let expected_output = fs::read_to_string(&output_file).expect(""); + + let mut cmd = Command::cargo_bin("xlg-sqlfmt").unwrap(); + let expected_with_newline = if expected_output.is_empty() { + expected_output.to_string() + } else { + format!("{}\n", expected_output) + }; cmd.write_stdin(input_sql.as_str()) .assert() .success() - .stdout(format!("{}\n", expected_output)); + .stdout(expected_with_newline); } } - -#[test] -fn test_all_fixtures() { - let fixtures = discover_fixtures(); - - assert!( - !fixtures.is_empty(), - "No fixtures found in tests/fixtures directory" - ); - - for fixture_path in fixtures { - let scenario_name = fixture_path.file_name().unwrap().to_str().unwrap(); - - println!("Running fixture test: {}", scenario_name); - - run_fixture_test(&fixture_path); - } -}
\ No newline at end of file |
