1 unstable release
new 0.2.2 | Feb 1, 2025 |
---|
#101 in #fuse
Used in 9 crates
(2 directly)
185KB
2.5K
SLoC
tktax-amazon
High-performance crate for deserializing Amazon CSV exports, unifying multi-epoch transaction data, and generating tabular outputs for taxation workflows. Provides idiomatic Rust abstractions for Amazon transactions, macros to instantiate medical/business purchases, and configurable options to merge distinct CSV epochs into consolidated records.
Overview
-
CSV Parsing (Latin: comma separata tabula):
parse_amazon_csv
accepts in-memory byte buffers and deserializes them into strongly-typed Rust structures implementing theAmazonTxn
trait.- Resilient to flexible CSV terminators, embedded quotes, and partial escaping sequences.
-
Transaction Fusion (Greek: συναρμολόγηση):
fuse_amazon_transactions_from_two_epochs
merges distinct epochs (e.g., AmazonTx1 vs. AmazonTx2) into a uniformAmazonTx
vector.- Simplifies archival or further analytic workflows.
-
Configurable CSV Aggregation:
maybe_fuse_amazon_csv_from_two_epochs
demonstrates orchestrating both epochs’ CSV data into a single CSV output, contingent upon a user-suppliedAmazonConfig
.
-
Macros for Medical/Business Purchases:
amazon_medical!
&amazon_business!
reduce boilerplate when constructing domain-specific line items, integrating cost, quantity, and date fields into robust builder patterns.
-
Auxiliary Constructs:
AmazonItemListing
andAmazonItemMap
facilitate indexing or referencing items by known identifiers.IndexedAmazonTx
ensures each record includes a short symbolic code plus standard transaction metadata.
-
Error Handling:
- Implements
AmazonError
(IoError
,CsvError
, andChronoParseError
) to capture explicit runtime anomalies. - Encourages safe error propagation without unwinding the runtime or resorting to stringly-typed errors.
- Implements
Usage
Parsing and Fusing CSVs:
use tktax_amazon::{parse_amazon_csv, fuse_amazon_transactions_from_two_epochs, AmazonTx1, AmazonTx2};
fn main() -> Result<(), tktax_amazon::AmazonError> {
// Ingest epoch1 CSV as AmazonTx1
let epoch1_contents = std::fs::read("path/to/epoch1.csv")?;
let epoch2_contents = std::fs::read("path/to/epoch2.csv")?;
let epoch1_txns = parse_amazon_csv::<AmazonTx1>(&epoch1_contents)?;
let epoch2_txns = parse_amazon_csv::<AmazonTx2>(&epoch2_contents)?;
let consolidated = fuse_amazon_transactions_from_two_epochs(epoch1_txns, epoch2_txns);
// Now operate on the unified `AmazonTx` vector or write it to a CSV
tktax_amazon::write_to_csv(consolidated, "consolidated.csv")?;
Ok(())
}
On-the-Fly Example Items:
use chrono::NaiveDate;
use tktax_amazon::amazon_medical;
use rust_decimal::Decimal;
// Construct a one-off medical purchase
let med_purchase = amazon_medical![1, "stethoscope", 79.95, NaiveDate::from_ymd(2025, 7, 15)];
println!("{:?}", med_purchase);
Configuration-Based Fusion:
let config = tktax_amazon::AmazonConfig {
txfile: "output.csv".into(),
epoch1file: "epoch1.csv".into(),
epoch2file: "epoch2.csv".into(),
};
match tktax_amazon::maybe_fuse_amazon_csv_from_two_epochs(&config) {
Ok(_) => println!("Successfully fused Amazon CSV data."),
Err(err) => eprintln!("Encountered error: {:?}", err),
}
Features and Extensions
- Multi-Epoch Compatibility: Automatic unification of different Amazon CSV layouts.
- Macro-Based Builders: Streamlined creation of typed domain items for specialized expenses.
- Decoupled Category Logic:
LineItem<TxCat>
trait obtains a user-defined category enumeration for accounting segregation. - Chrono & Decimal Integration: Leverages
NaiveDate
for time fields,Decimal
for quantity, and customMonetaryAmount
for robust currency handling.
License
Distributed under the MIT License.
Dependencies
~26–37MB
~643K SLoC