From cb35e38df9eccf742bc8cc040bd7d35e5d24ea54 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Mon, 13 Apr 2026 21:58:14 -0700 Subject: [PATCH] refactor(all): use let chains to flatten nested if statements Replace nested if and if let blocks with combined if statements using let chains. This reduces indentation and improves readability across the project. Co-Authored-By: fiddlerwoaroof/git-smart-commit (gemma-4-31B-it-UD-Q4_K_XL.gguf) --- src/draw.rs | 5 ++--- src/import/wizard.rs | 10 ++++------ src/model/types.rs | 25 ++++++++++--------------- src/persistence/mod.rs | 20 ++++++++------------ src/ui/app.rs | 5 ++--- src/ui/cat_tree.rs | 5 ++--- src/ui/effect.rs | 5 ++--- src/view/layout.rs | 5 ++--- 8 files changed, 32 insertions(+), 48 deletions(-) diff --git a/src/draw.rs b/src/draw.rs index 07a591c..292ecc9 100644 --- a/src/draw.rs +++ b/src/draw.rs @@ -167,11 +167,10 @@ fn draw(f: &mut Frame, app: &App) { if matches!(app.mode, AppMode::Help) { f.render_widget(HelpWidget::new(app.help_page), size); } - if matches!(app.mode, AppMode::ImportWizard) { - if let Some(wizard) = &app.wizard { + if matches!(app.mode, AppMode::ImportWizard) + && let Some(wizard) = &app.wizard { f.render_widget(ImportWizardWidget::new(wizard), size); } - } // ExportPrompt now uses the minibuffer at the bottom bar. if app.is_empty_model() && matches!(app.mode, AppMode::Normal | AppMode::CommandMode { .. }) { draw_welcome(f, main_chunks[1]); diff --git a/src/import/wizard.rs b/src/import/wizard.rs index bf977f1..79e2e30 100644 --- a/src/import/wizard.rs +++ b/src/import/wizard.rs @@ -149,13 +149,12 @@ impl ImportPipeline { model.add_label_category(&lab.field)?; } - if !measures.is_empty() { - if let Some(cat) = model.category_mut("_Measure") { + if !measures.is_empty() + && let Some(cat) = model.category_mut("_Measure") { for m in &measures { cat.add_item(&m.field); } } - } for record in &self.records { if let Value::Object(map) = record { @@ -177,14 +176,13 @@ impl ImportPipeline { // Extract date components from this field's value for (field, fmt, comp, derived_name) in &date_extractions { - if *field == cat_proposal.field { - if let Some(derived_val) = extract_date_component(&v, fmt, *comp) { + if *field == cat_proposal.field + && let Some(derived_val) = extract_date_component(&v, fmt, *comp) { if let Some(cat) = model.category_mut(derived_name) { cat.add_item(&derived_val); } coords.push((derived_name.clone(), derived_val)); } - } } } else { valid = false; diff --git a/src/model/types.rs b/src/model/types.rs index 08d381c..ed2f786 100644 --- a/src/model/types.rs +++ b/src/model/types.rs @@ -184,11 +184,10 @@ impl Model { // For non-_Measure target categories, add the target as a category item // so it appears in the grid. _Measure targets are dynamically included // via measure_item_names(). - if formula.target_category != "_Measure" { - if let Some(cat) = self.categories.get_mut(&formula.target_category) { + if formula.target_category != "_Measure" + && let Some(cat) = self.categories.get_mut(&formula.target_category) { cat.add_item(&formula.target); } - } // Replace if same target within the same category if let Some(pos) = self.formulas.iter().position(|f| { f.target == formula.target && f.target_category == formula.target_category @@ -331,11 +330,10 @@ impl Model { return Some(CellValue::Error("circular".into())); } for formula in &self.formulas { - if let Some(item_val) = key.get(&formula.target_category) { - if item_val == formula.target { + if let Some(item_val) = key.get(&formula.target_category) + && item_val == formula.target { return self.eval_formula_depth(formula, key, depth - 1); } - } } self.data.get(key).cloned() } @@ -457,11 +455,10 @@ impl Model { /// Uses raw data aggregation for non-formula refs and the cache for formula refs. fn evaluate_formula_cell(&self, key: &CellKey, none_cats: &[String]) -> Option { for formula in &self.formulas { - if let Some(item_val) = key.get(&formula.target_category) { - if item_val == formula.target { + if let Some(item_val) = key.get(&formula.target_category) + && item_val == formula.target { return self.eval_formula_with_cache(formula, key, none_cats); } - } } None } @@ -562,11 +559,10 @@ impl Model { Expr::Agg(func, inner, agg_filter) => { use crate::formula::AggFunc; let mut partial = context.without(target_category); - if let Expr::Ref(item_name) = inner.as_ref() { - if let Some(cat) = find_item_category(model, item_name) { + if let Expr::Ref(item_name) = inner.as_ref() + && let Some(cat) = find_item_category(model, item_name) { partial = partial.with(cat, item_name.as_str()); } - } if let Some(f) = agg_filter { partial = partial.with(&f.category, &f.item); } @@ -756,11 +752,10 @@ impl Model { Expr::UnaryMinus(e) => Ok(-eval_expr(e, context, model, target_category, depth)?), Expr::Agg(func, inner, agg_filter) => { let mut partial = context.without(target_category); - if let Expr::Ref(item_name) = inner.as_ref() { - if let Some(cat) = find_item_category(model, item_name) { + if let Expr::Ref(item_name) = inner.as_ref() + && let Some(cat) = find_item_category(model, item_name) { partial = partial.with(cat, item_name.as_str()); } - } if let Some(f) = agg_filter { partial = partial.with(&f.category, &f.item); } diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 54ce753..6846388 100644 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -170,12 +170,11 @@ pub fn format_md(model: &Model) -> String { w!(out, "\n## View: {}", view.name); for (cat, axis) in &view.category_axes { let qcat = quote_name(cat); - if *axis == Axis::Page { - if let Some(sel) = view.page_selections.get(cat) { + if *axis == Axis::Page + && let Some(sel) = view.page_selections.get(cat) { w!(out, "{qcat}: page, {}", quote_name(sel)); continue; } - } let axis_str = match axis { Axis::Row => "row", Axis::Column => "column", @@ -398,15 +397,14 @@ pub fn parse_md(text: &str) -> Result { for fl in pair.into_inner() { if fl.as_rule() == Rule::formula_line { let raw = first_str(fl)?; - if let Some(i) = raw.rfind(" [") { - if raw.ends_with(']') { + if let Some(i) = raw.rfind(" [") + && raw.ends_with(']') { formulas.push(( raw[..i].to_string(), raw[i + 2..raw.len() - 1].to_string(), )); continue; } - } // No [Category] suffix — default to _Measure if !raw.is_empty() && raw.contains('=') { formulas.push((raw, "_Measure".to_string())); @@ -476,11 +474,10 @@ pub fn parse_md(text: &str) -> Result { _ => bail!("Unknown axis kind: {kind_str}"), }; pv.axes.push((cat.clone(), axis)); - if axis == Axis::Page { - if let Some(sel_pair) = parts.next() { + if axis == Axis::Page + && let Some(sel_pair) = parts.next() { pv.page_selections.push((cat, extract_name(sel_pair)?)); } - } } Rule::format_line => pv.format = first_str(entry)?, Rule::hidden_line => pv.hidden.push(extract_name_pair(entry)?), @@ -550,11 +547,10 @@ pub fn parse_md(text: &str) -> Result { } } - if let Some(iv) = &initial_view { - if m.views.contains_key(iv) { + if let Some(iv) = &initial_view + && m.views.contains_key(iv) { m.active_view = iv.clone(); } - } for (raw, cat_name) in &formulas { m.add_formula(parse_formula(raw, cat_name).with_context(|| format!("Formula: {raw}"))?); diff --git a/src/ui/app.rs b/src/ui/app.rs index 831137b..838882a 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -374,13 +374,12 @@ impl App { } pub fn autosave_if_needed(&mut self) { - if self.dirty && self.last_autosave.elapsed() > Duration::from_secs(30) { - if let Some(path) = &self.file_path.clone() { + if self.dirty && self.last_autosave.elapsed() > Duration::from_secs(30) + && let Some(path) = &self.file_path.clone() { let ap = persistence::autosave_path(path); let _ = persistence::save(&self.model, &ap); self.last_autosave = Instant::now(); } - } } pub fn start_import_wizard(&mut self, json: serde_json::Value) { diff --git a/src/ui/cat_tree.rs b/src/ui/cat_tree.rs index ae267e8..e07b4fb 100644 --- a/src/ui/cat_tree.rs +++ b/src/ui/cat_tree.rs @@ -36,8 +36,8 @@ pub fn build_cat_tree(model: &Model, expanded: &HashSet) -> Vec) -> Vec { diff --git a/src/view/layout.rs b/src/view/layout.rs index 4b7aad4..a018392 100644 --- a/src/view/layout.rs +++ b/src/view/layout.rs @@ -53,15 +53,14 @@ impl GridLayout { frozen_records: Option>>, ) -> Self { let mut layout = Self::new(model, view); - if layout.is_records_mode() { - if let Some(records) = frozen_records { + if layout.is_records_mode() + && let Some(records) = frozen_records { let row_items: Vec = (0..records.len()) .map(|i| AxisEntry::DataItem(vec![i.to_string()])) .collect(); layout.row_items = row_items; layout.records = Some(records); } - } if view.prune_empty { layout.prune_empty(model); }