FinTech Domain
Layer 3: Domain Constraints
Domain Constraints → Design Implications Domain Rule Design Constraint Rust Implication Audit trail Immutable records Arc, no mutation Precision No floating point rust_decimal Consistency Transaction boundaries Clear ownership Compliance Complete logging Structured tracing Reproducibility Deterministic execution No race conditions Critical Constraints Financial Precision RULE: Never use f64 for money WHY: Floating point loses precision RUST: Use rust_decimal::Decimal
Audit Requirements
RULE: All transactions must be immutable and traceable
WHY: Regulatory compliance, dispute resolution
RUST: Arc
Consistency RULE: Money can't disappear or appear WHY: Double-entry accounting principles RUST: Transaction types with validated totals
Trace Down ↓
From constraints to design (Layer 2):
"Need immutable transaction records" ↓ m09-domain: Model as Value Objects ↓ m01-ownership: Use Arc for shared immutable data
"Need precise decimal math" ↓ m05-type-driven: Newtype for Currency/Amount ↓ rust_decimal: Use Decimal type
"Need transaction boundaries" ↓ m12-lifecycle: RAII for transaction scope ↓ m09-domain: Aggregate boundaries
Key Crates Purpose Crate Decimal math rust_decimal Date/time chrono, time UUID uuid Serialization serde Validation validator Design Patterns Pattern Purpose Implementation Currency newtype Type safety struct Amount(Decimal); Transaction Atomic operations Event sourcing Audit log Traceability Structured logging with trace IDs Ledger Double-entry Debit/credit balance Code Pattern: Currency Type use rust_decimal::Decimal;
[derive(Clone, Debug, PartialEq)]
pub struct Amount { value: Decimal, currency: Currency, }
impl Amount { pub fn new(value: Decimal, currency: Currency) -> Self { Self { value, currency } }
pub fn add(&self, other: &Amount) -> Result<Amount, CurrencyMismatch> {
if self.currency != other.currency {
return Err(CurrencyMismatch);
}
Ok(Amount::new(self.value + other.value, self.currency))
}
}
Common Mistakes Mistake Domain Violation Fix Using f64 Precision loss rust_decimal Mutable transaction Audit trail broken Immutable + events String for amount No validation Validated newtype Silent overflow Money disappears Checked arithmetic Trace to Layer 1 Constraint Layer 2 Pattern Layer 1 Implementation Immutable records Event sourcing Arc, Clone Transaction scope Aggregate Owned children Precision Value Object rust_decimal newtype Thread-safe sharing Shared immutable Arc (not Rc) Related Skills When See Value Object design m09-domain Ownership for immutable m01-ownership Arc for sharing m02-resource Error handling m13-domain-error