rustledger-ops
Pure operations on beancount directives — dedup, categorize, reconcile.
Overview
This crate provides reusable functions for transforming and analyzing collections of beancount directives. All operations are pure — they take directives in and return results out, with no I/O or framework coupling.
Analogous to Python beancount's ops/ module.
Modules
| Module | Description |
|---|---|
fingerprint |
Structural hashing and stable fingerprinting of transactions |
dedup |
Duplicate detection (structural, fuzzy, and fingerprint-based) |
categorize |
Rule-based and pattern-based account categorization |
merchants |
Merchant name normalization and lookup dictionary |
enrichment |
Shared types for operation results (confidence, method, alternatives) |
ml |
ML-based categorization (TF-IDF + Naive Bayes); host-only, absent on wasm targets |
transfer |
Transfer detection between own accounts |
reconcile |
Reconciliation of imported vs. existing directives |
Usage
use find_structural_duplicates;
use structural_hash;
// Find duplicate transactions in a directive list
let duplicates = find_structural_duplicates;
// Compute a structural hash of a single transaction
let hash = structural_hash;
Design
Operations in this crate depend on rustledger-plugin-types (for DirectiveWrapper and related types) plus utility crates (rust_decimal, jiff, blake3, regex, and a host-only ML stack for the ml module). They know nothing about the plugin runtime, CLI, LSP, or import system.
This separation allows the same operations to be used by:
- The plugin system (via thin
NativePluginwrappers) - The import pipeline (for dedup and categorization)
- CLI commands (e.g.,
rledger dedup) - The LSP (for diagnostics and code actions)
License
GPL-3.0