From 42e600bbf214337bfbd573964288b84e6d530b98 Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Sun, 11 Oct 2026 19:24:10 -0700 Subject: [PATCH] chore: clippy clean across the workspace, all targets Zero warnings from `cargo clippy --workspace --all-targets`, which is now a hard rule rather than "clean except pre-existing": - ChartOfAccounts::add takes the Account it registers instead of eight loose parameters (too_many_arguments); Ledger::add_account builds it. Same validation, same errors. - close_period tool: collapse the nested if-let into a let chain. - iif.rs docs: the IIF layout example shows tabs as `\t` instead of literal tab characters (tabs_in_doc_comments). - Tests: drop an unused binding; assert! instead of assert_eq! against a literal bool. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MtYEaR6M6Ybdhm6X98BWNu --- crates/ledger-core/src/account.rs | 34 ++++++-------------------- crates/ledger-core/src/ledger.rs | 18 +++++++------- crates/ledger-core/tests/invariants.rs | 2 +- crates/ledger-import/src/iif.rs | 10 ++++---- crates/ledger-mcp/src/server.rs | 22 ++++++++--------- crates/ledger-mcp/tests/mcp_stdio.rs | 2 +- plan/STATUS.md | 5 ++-- 7 files changed, 37 insertions(+), 56 deletions(-) diff --git a/crates/ledger-core/src/account.rs b/crates/ledger-core/src/account.rs index 5097f0a..811728c 100644 --- a/crates/ledger-core/src/account.rs +++ b/crates/ledger-core/src/account.rs @@ -84,40 +84,20 @@ pub struct ChartOfAccounts { impl ChartOfAccounts { /// Register an account. Codes must be unique and non-empty; a parent, if /// given, must already exist. - pub fn add( - &mut self, - id: AccountId, - code: &str, - name: &str, - account_type: AccountType, - parent: Option, - placeholder: bool, - currency: Currency, - ) -> Result<(), LedgerError> { - if code.is_empty() { + pub fn add(&mut self, account: Account) -> Result<(), LedgerError> { + if account.code.is_empty() { return Err(LedgerError::EmptyAccountCode); } - if self.by_code.contains_key(code) { - return Err(LedgerError::DuplicateAccountCode(code.to_string())); + if self.by_code.contains_key(&account.code) { + return Err(LedgerError::DuplicateAccountCode(account.code)); } - if let Some(p) = parent + if let Some(p) = account.parent && !self.accounts.contains_key(&p) { return Err(LedgerError::UnknownParentAccount(p)); } - self.by_code.insert(code.to_string(), id); - self.accounts.insert( - id, - Account { - id, - code: code.to_string(), - name: name.to_string(), - account_type, - parent, - placeholder, - currency, - }, - ); + self.by_code.insert(account.code.clone(), account.id); + self.accounts.insert(account.id, account); Ok(()) } diff --git a/crates/ledger-core/src/ledger.rs b/crates/ledger-core/src/ledger.rs index d1858f1..fd1aa8a 100644 --- a/crates/ledger-core/src/ledger.rs +++ b/crates/ledger-core/src/ledger.rs @@ -7,10 +7,10 @@ //! audit trail and what will make the future oracle harness trustworthy. use crate::{ - AccountId, AccountType, AgingRow, Asset, AssetId, AssetStatus, Bill, BillId, ChartOfAccounts, - Class, ClassId, Currency, Customer, CustomerId, DocumentLine, DocumentStatus, EntryId, - EntryStatus, Invoice, InvoiceId, JournalEntry, JournalLine, LedgerError, Money, NewAsset, - Period, PeriodId, PeriodStatus, Side, Vendor, VendorId, arap, assets, + Account, AccountId, AccountType, AgingRow, Asset, AssetId, AssetStatus, Bill, BillId, + ChartOfAccounts, Class, ClassId, Currency, Customer, CustomerId, DocumentLine, DocumentStatus, + EntryId, EntryStatus, Invoice, InvoiceId, JournalEntry, JournalLine, LedgerError, Money, + NewAsset, Period, PeriodId, PeriodStatus, Side, Vendor, VendorId, arap, assets, payroll::{ PayrollAccounts, PayrollLine, PayrollRun, PayrollRunId, payroll_entry_plan, payroll_remit_plan, validate_payroll_lines, @@ -220,15 +220,15 @@ impl Ledger { ) -> Result { let id = self.next_account_id; self.next_account_id += 1; - self.chart.add( + self.chart.add(Account { id, - code, - name, + code: code.to_string(), + name: name.to_string(), account_type, parent, placeholder, - self.base_currency, - )?; + currency: self.base_currency, + })?; Ok(id) } diff --git a/crates/ledger-core/tests/invariants.rs b/crates/ledger-core/tests/invariants.rs index 927a7ca..6450ca5 100644 --- a/crates/ledger-core/tests/invariants.rs +++ b/crates/ledger-core/tests/invariants.rs @@ -550,7 +550,7 @@ fn cash_flow_with_registered_asset_and_disposal() { false, ) .unwrap(); - let revenue = ledger + ledger .add_account("4000", "Service Revenue", AccountType::Revenue, None, false) .unwrap(); let gain = ledger diff --git a/crates/ledger-import/src/iif.rs b/crates/ledger-import/src/iif.rs index f1d7275..3dd5d13 100644 --- a/crates/ledger-import/src/iif.rs +++ b/crates/ledger-import/src/iif.rs @@ -1,14 +1,14 @@ //! Generate Intuit Interchange Format (IIF) journal entries for QuickBooks //! Desktop, which many CPAs still run. //! -//! Layout per entry: +//! Layout per entry (fields are tab-separated; `\t` marks each tab): //! //! ```text -//! !TRNS TRNSTYPE DATE ACCNT NAME AMOUNT DOCNUM MEMO -//! !SPL TRNSTYPE DATE ACCNT AMOUNT DOCNUM MEMO +//! !TRNS\tTRNSTYPE\tDATE\tACCNT\tNAME\tAMOUNT\tDOCNUM\tMEMO +//! !SPL\tTRNSTYPE\tDATE\tACCNT\tAMOUNT\tDOCNUM\tMEMO //! !ENDTRNS -//! TRNS GENERAL JOURNAL 01/15/2026 Cash 1000.00 1 Memo -//! SPL GENERAL JOURNAL 01/15/2026 Revenue -1000.00 1 Memo +//! TRNS\tGENERAL JOURNAL\t01/15/2026\tCash\t\t1000.00\t1\tMemo +//! SPL\tGENERAL JOURNAL\t01/15/2026\tRevenue\t-1000.00\t1\tMemo //! ENDTRNS //! ``` //! diff --git a/crates/ledger-mcp/src/server.rs b/crates/ledger-mcp/src/server.rs index 9418d00..d593883 100644 --- a/crates/ledger-mcp/src/server.rs +++ b/crates/ledger-mcp/src/server.rs @@ -1893,17 +1893,17 @@ impl BooksServer { let closing = store.close_period(p.period_id).map_err(|e| e.to_string())?; // Build line descriptions from the posted closing entry. let mut lines = Vec::new(); - if let Some(eid) = closing { - if let Some(entry) = store.ledger().get_entry(eid) { - for line in entry.lines() { - let code = store - .ledger() - .chart() - .get(line.account) - .map(|a| a.code.clone()) - .unwrap_or_default(); - lines.push(format!("{:?} {} {}", line.side, code, line.amount.amount)); - } + if let Some(eid) = closing + && let Some(entry) = store.ledger().get_entry(eid) + { + for line in entry.lines() { + let code = store + .ledger() + .chart() + .get(line.account) + .map(|a| a.code.clone()) + .unwrap_or_default(); + lines.push(format!("{:?} {} {}", line.side, code, line.amount.amount)); } } Ok(Json(ClosePeriodOut { diff --git a/crates/ledger-mcp/tests/mcp_stdio.rs b/crates/ledger-mcp/tests/mcp_stdio.rs index 9504ba8..5d70f07 100644 --- a/crates/ledger-mcp/tests/mcp_stdio.rs +++ b/crates/ledger-mcp/tests/mcp_stdio.rs @@ -688,7 +688,7 @@ fn mcp_resources_over_stdio() { ); assert_eq!(init["result"]["serverInfo"]["name"], "wanderbooks"); // Resources are advertised. - assert_eq!(init["result"]["capabilities"]["resources"].is_null(), false); + assert!(!init["result"]["capabilities"]["resources"].is_null()); mcp.notify("notifications/initialized"); mcp.call( diff --git a/plan/STATUS.md b/plan/STATUS.md index 3bb36a3..c475f8a 100644 --- a/plan/STATUS.md +++ b/plan/STATUS.md @@ -51,8 +51,9 @@ public. Parity is 12 of 12 against the spreadsheet workflow. the last caught a real month-length-drift bug, fixed with the final-month true-up); `cargo-mutants` run on `ledger-core` (228 mutants); `cargo-fuzz` targets (journal-line parsing, entry validation, op sequences) scaffolded. -- 40+ tests green workspace-wide; `cargo fmt` clean; clippy clean except one - pre-existing phase-1 style lint on a public engine signature. +- 120+ tests green workspace-wide; `cargo fmt` clean; `cargo clippy + --workspace --all-targets` clean, zero warnings (a hard rule: Stephen, + 2026-10-11). - Docs: AGENTS.md (operating manual), requirements, architecture, oracle design, parity catalog (floor: 10 done), glossary, mcp-interface (incl. the 5 asset tools), receipt-store (journal design), capability-parity