Commit cdccae4

mo khan <mo@mokhan.ca>
2025-09-24 18:45:08
feat: change the formatting
1 parent c7efcab
Changed files (2)
src/formatter.rs
@@ -148,13 +148,18 @@ fn format_select(select: &Select, indent_level: usize) -> String {
         result.push_str(" DISTINCT");
     }
 
-    for (i, item) in select.projection.iter().enumerate() {
-        if i == 0 {
-            result.push('\n');
-        } else {
-            result.push_str(",\n");
+    if select.projection.len() == 1 && is_simple_projection(&select.projection[0]) {
+        result.push(' ');
+        result.push_str(&format_select_item(&select.projection[0]));
+    } else {
+        for (i, item) in select.projection.iter().enumerate() {
+            if i == 0 {
+                result.push('\n');
+            } else {
+                result.push_str(",\n");
+            }
+            result.push_str(&format!("{}{}", item_indent, format_select_item(item)));
         }
-        result.push_str(&format!("{}{}", item_indent, format_select_item(item)));
     }
 
     if !select.from.is_empty() {
@@ -182,7 +187,7 @@ fn format_select(select: &Select, indent_level: usize) -> String {
 
     if let Some(selection) = &select.selection {
         result.push('\n');
-        result.push_str(&format!("{}WHERE {}", base_indent, format_expr(selection)));
+        result.push_str(&format!("{}WHERE {}", base_indent, format_where_expr(selection, indent_level + 2)));
     }
 
     match &select.group_by {
@@ -632,3 +637,32 @@ fn format_create_table(name: &ObjectName, columns: &[ColumnDef], indent_level: u
     result.push_str(&format!("{})", " ".repeat(indent_level)));
     result
 }
+
+fn is_simple_projection(item: &SelectItem) -> bool {
+    match item {
+        SelectItem::UnnamedExpr(expr) => is_simple_expr(expr),
+        SelectItem::ExprWithAlias { expr, .. } => is_simple_expr(expr),
+        SelectItem::Wildcard(_) => true,
+        SelectItem::QualifiedWildcard(_, _) => true,
+    }
+}
+
+fn is_simple_expr(expr: &Expr) -> bool {
+    match expr {
+        Expr::Identifier(_) => true,
+        Expr::CompoundIdentifier(_) => true,
+        Expr::Value(_) => true,
+        _ => false,
+    }
+}
+
+fn format_where_expr(expr: &Expr, indent_level: usize) -> String {
+    match expr {
+        Expr::BinaryOp { left, op, right } if matches!(op, BinaryOperator::And) => {
+            let left_str = format_where_expr(left, indent_level);
+            let right_str = format_where_expr(right, indent_level);
+            format!("{}\n{}AND {}", left_str, " ".repeat(indent_level), right_str)
+        }
+        _ => format_expr(expr),
+    }
+}
Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "xlg-sqlfmt"
-version = "0.1.0"
+version = "0.1.1"
 edition = "2024"
 description = "A command-line SQL formatter that reads SQL from stdin and writes formatted SQL to stdout"
 license = "MIT"