Commit 4d28987

mo khan <mo@mokhan.ca>
2025-09-25 15:29:51
refactor: cleanup
1 parent 6c5934d
Changed files (6)
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),
tests/fixtures/invalid_sql/input.sql
@@ -1,1 +0,0 @@
-INVALID SQL SYNTAX HERE
\ No newline at end of file
tests/fixtures/invalid_sql/output.sql
@@ -1,1 +0,0 @@
-INVALID SQL SYNTAX HERE
\ No newline at end of file
tests/fixtures/invalid_sql_passthrough/input.sql
@@ -1,1 +0,0 @@
-INVALID SQL SYNTAX
\ No newline at end of file
tests/fixtures/invalid_sql_passthrough/output.sql
@@ -1,1 +0,0 @@
-INVALID SQL SYNTAX
\ No newline at end of file
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