Skip to main content

rustledger_core/
lib.rs

1//! Core types for rustledger
2//!
3//! This crate provides the fundamental types used throughout the rustledger project:
4//!
5//! - [`Amount`] - A decimal number with a currency
6//! - [`Cost`] - Acquisition cost of a position (lot)
7//! - [`CostSpec`] - Specification for matching or creating costs
8//! - [`Position`] - Units held at a cost
9//! - [`Inventory`] - A collection of positions with booking support
10//! - [`BookingMethod`] - How to match lots when reducing positions
11//! - [`Directive`] - All directive types (Transaction, Balance, Open, etc.)
12//!
13//! # Example
14//!
15//! ```
16//! use rustledger_core::{Amount, Cost, Position, Inventory, BookingMethod};
17//! use rust_decimal_macros::dec;
18//! use chrono::NaiveDate;
19//!
20//! // Create an inventory
21//! let mut inv = Inventory::new();
22//!
23//! // Add a stock position with cost
24//! let cost = Cost::new(dec!(150.00), "USD")
25//!     .with_date(NaiveDate::from_ymd_opt(2024, 1, 15).unwrap());
26//! inv.add(Position::with_cost(Amount::new(dec!(10), "AAPL"), cost));
27//!
28//! // Check holdings
29//! assert_eq!(inv.units("AAPL"), dec!(10));
30//!
31//! // Sell some shares using FIFO
32//! let result = inv.reduce(
33//!     &Amount::new(dec!(-5), "AAPL"),
34//!     None,
35//!     BookingMethod::Fifo,
36//! ).unwrap();
37//!
38//! assert_eq!(inv.units("AAPL"), dec!(5));
39//! assert_eq!(result.cost_basis.unwrap().number, dec!(750.00)); // 5 * 150
40//! ```
41
42#![forbid(unsafe_code)]
43#![warn(missing_docs)]
44
45pub mod amount;
46pub mod cost;
47pub mod directive;
48pub mod display_context;
49pub mod extract;
50pub mod format;
51pub mod intern;
52pub mod inventory;
53pub mod position;
54pub mod synthetic;
55
56// Kani formal verification proofs (only compiled with Kani)
57#[cfg(kani)]
58mod kani_proofs;
59
60pub use amount::{Amount, IncompleteAmount};
61pub use cost::{Cost, CostSpec};
62pub use directive::{
63    Balance, Close, Commodity, Custom, Directive, DirectivePriority, Document, Event, MetaValue,
64    Metadata, Note, Open, Pad, Posting, Price, PriceAnnotation, Query, Transaction,
65    sort_directives,
66};
67pub use display_context::DisplayContext;
68pub use extract::{
69    DEFAULT_CURRENCIES, extract_accounts, extract_accounts_iter, extract_currencies,
70    extract_currencies_iter, extract_payees, extract_payees_iter,
71};
72pub use format::{FormatConfig, format_directive};
73pub use intern::{InternedStr, StringInterner};
74pub use inventory::{AccountedBookingError, BookingError, BookingMethod, BookingResult, Inventory};
75pub use position::Position;
76
77// Re-export commonly used external types
78pub use chrono::NaiveDate;
79pub use rust_decimal::Decimal;
80
81// Re-export rkyv wrappers when feature is enabled
82#[cfg(feature = "rkyv")]
83pub use intern::{AsDecimal, AsInternedStr, AsNaiveDate};