Skip to main content

stateset_core/
lib.rs

1#![deny(unsafe_code)]
2#![cfg_attr(not(test), deny(clippy::unwrap_used))]
3#![cfg_attr(not(test), warn(unused_crate_dependencies))]
4#![cfg_attr(docsrs, feature(doc_cfg))]
5#![doc(
6    html_logo_url = "https://raw.githubusercontent.com/stateset/stateset-icommerce/main/assets/stateset.png",
7    html_favicon_url = "https://raw.githubusercontent.com/stateset/stateset-icommerce/main/assets/favicon.ico",
8    issue_tracker_base_url = "https://github.com/stateset/stateset-icommerce/issues/"
9)]
10
11//! # StateSet Core
12//!
13//! Pure domain models and business logic for commerce operations.
14//! This crate has no I/O dependencies - just data structures and validation.
15//!
16//! ## Overview
17//!
18//! `stateset-core` provides the foundational types for the StateSet iCommerce platform:
19//!
20//! - **Domain Models**: Strongly-typed structs for all commerce entities
21//! - **Repository Traits**: Abstract interfaces for data access
22//! - **Error Types**: Comprehensive error handling with categorization
23//! - **Validation**: Composable validation builders and traits
24//! - **Events**: Domain event types for event-driven architectures
25//!
26//! ## Core Domains
27//!
28//! | Domain | Description |
29//! |--------|-------------|
30//! | **Orders** | Order management with line items, status tracking |
31//! | **Inventory** | Stock tracking, reservations, adjustments |
32//! | **Customers** | Customer profiles, addresses, contact info |
33//! | **Products** | Product catalog with variants, pricing |
34//! | **Returns** | Return processing, refunds, RMA |
35//! | **Manufacturing** | Bill of Materials (BOM), Work Orders |
36//! | **Shipments** | Shipping, tracking, carrier integration |
37//! | **Payments** | Payment processing, refunds |
38//! | **Subscriptions** | Recurring billing, subscription plans |
39//! | **Promotions** | Discounts, coupons, promotional campaigns |
40//! | **Tax** | Multi-jurisdiction tax calculation |
41//! | **Currency** | Multi-currency support, exchange rates |
42//!
43//! ## Error Handling
44//!
45//! All operations return `Result<T, CommerceError>`. Errors can be categorized:
46//!
47//! ```rust
48//! use stateset_core::CommerceError;
49//!
50//! fn handle_error(err: &CommerceError) {
51//!     if err.is_not_found() {
52//!         // Handle not found errors (404)
53//!     } else if err.is_validation() {
54//!         // Handle validation errors (400)
55//!     } else if err.is_conflict() {
56//!         // Handle conflict errors (409)
57//!     } else if err.is_database() {
58//!         // Handle database errors (500)
59//!     } else if err.is_retryable() {
60//!         // Retry the operation
61//!     }
62//! }
63//! ```
64//!
65//! ## Validation
66//!
67//! Use `ValidationBuilder` for composable validations:
68//!
69//! ```rust
70//! use stateset_core::{ValidationBuilder, Result};
71//!
72//! fn validate_order(email: &str, quantity: i32) -> Result<()> {
73//!     ValidationBuilder::new()
74//!         .email("email", email)
75//!         .positive_i32("quantity", quantity)
76//!         .build()
77//! }
78//! ```
79//!
80//! Or implement the `Validate` trait for domain models:
81//!
82//! ```rust
83//! use stateset_core::{Validate, ValidationBuilder, Result};
84//!
85//! struct OrderInput {
86//!     email: String,
87//!     quantity: i32,
88//! }
89//!
90//! impl Validate for OrderInput {
91//!     fn validate(&self) -> Result<()> {
92//!         ValidationBuilder::new()
93//!             .email("email", &self.email)
94//!             .positive_i32("quantity", self.quantity)
95//!             .build()
96//!     }
97//! }
98//!
99//! // Use with method chaining
100//! // let input = OrderInput { ... }.validated()?;
101//! ```
102//!
103//! ## Example
104//!
105//! ```rust
106//! use stateset_core::prelude::*;
107//! use rust_decimal_macros::dec;
108//!
109//! // Create an order input
110//! let order = CreateOrder {
111//!     customer_id: CustomerId::new(),
112//!     items: vec![CreateOrderItem {
113//!         sku: "SKU-001".to_string(),
114//!         name: "Widget".to_string(),
115//!         quantity: 2,
116//!         unit_price: dec!(29.99),
117//!         ..Default::default()
118//!     }],
119//!     ..Default::default()
120//! };
121//! ```
122//!
123//! ## Feature Flags
124//!
125//! - `embeddings` - Enable vector search via embedding services
126//! - `metrics` - Enable Prometheus metrics support
127
128// This crate has extensive surface area; enforcing `missing_docs` across the whole
129// API makes `-D warnings` builds impractical. We keep the option to enable it for
130// docs builds instead.
131#![cfg_attr(docsrs, warn(missing_docs))]
132
133pub mod errors;
134pub mod events;
135pub mod models;
136pub mod traits;
137pub mod validation;
138
139#[cfg(feature = "embeddings")]
140pub mod services;
141
142#[cfg(feature = "metrics")]
143pub mod metrics;
144
145pub use errors::*;
146pub use events::*;
147pub use models::*;
148pub use traits::*;
149pub use validation::*;
150
151#[cfg(feature = "embeddings")]
152pub use services::*;
153
154// Re-export strongly-typed primitives so downstream crates can import from
155// `stateset_core` directly without depending on `stateset-primitives`.
156pub use stateset_primitives::{
157    ActivityLogId, AgentId, CartId, ChannelId, CompanyAddressId, CompanyId, ContactId, CreditId,
158    CurrencyCode, CustomerId, EdiDocumentId, FraudRuleId, FulfillmentId, GiftCardId,
159    GiftCardTransactionId, InboundShipmentId, InboundShipmentItemId, IntegrationFieldMappingId,
160    IntegrationMappingId, InventoryItemId, InvoiceId, LoyaltyAccountId, LoyaltyProgramId,
161    LoyaltyTransactionId, Money, OrderId, OrderItemId, PaymentId, PaymentObligationId,
162    PrepaymentApplicationId, PrepaymentId, PriceLevelId, PriceScheduleId, PrintJobId,
163    PrintStationId, ProductId, ProductionBatchId, PromotionId, PurchaseOrderId,
164    PurgatoryLineItemId, PurgatoryOrderId, ReturnId, ReviewId, RewardId, SearchConfigId, SegmentId,
165    ShipmentId, ShippingMethodId, ShippingZoneId, Sku, StockSnapshotId, StockSnapshotLineId,
166    StoreCreditId, StoreCreditTransactionId, SubscriptionId, SupplierSkuId, TopologySnapshotId,
167    TransferOrderId, TransferOrderItemId, UnitClassId, UnitConversionRuleId, UnitOfMeasureId,
168    VendorCreditApplicationId, VendorCreditId, VendorReturnId, VendorReturnItemId, WarehouseId,
169    WarrantyId, WishlistId,
170};
171
172/// Re-export common types for convenience
173pub mod prelude {
174    pub use crate::errors::*;
175    pub use crate::events::*;
176    pub use crate::models::*;
177    pub use crate::traits::*;
178    pub use crate::validation::*;
179
180    // Typed IDs and value types
181    pub use stateset_primitives::{
182        ActivityLogId, AgentId, CartId, ChannelId, CompanyAddressId, CompanyId, ContactId,
183        CreditId, CurrencyCode, CustomerId, EdiDocumentId, FraudRuleId, FulfillmentId, GiftCardId,
184        GiftCardTransactionId, InboundShipmentId, InboundShipmentItemId, IntegrationFieldMappingId,
185        IntegrationMappingId, InventoryItemId, InvoiceId, LoyaltyAccountId, LoyaltyProgramId,
186        LoyaltyTransactionId, Money, OrderId, OrderItemId, PaymentId, PaymentObligationId,
187        PrepaymentApplicationId, PrepaymentId, PriceLevelId, PriceScheduleId, PrintJobId,
188        PrintStationId, ProductId, ProductionBatchId, PromotionId, PurchaseOrderId,
189        PurgatoryLineItemId, PurgatoryOrderId, ReturnId, ReviewId, RewardId, SearchConfigId,
190        SegmentId, ShipmentId, ShippingMethodId, ShippingZoneId, Sku, StockSnapshotId,
191        StockSnapshotLineId, StoreCreditId, StoreCreditTransactionId, SubscriptionId,
192        SupplierSkuId, TopologySnapshotId, TransferOrderId, TransferOrderItemId, UnitClassId,
193        UnitConversionRuleId, UnitOfMeasureId, VendorCreditApplicationId, VendorCreditId,
194        VendorReturnId, VendorReturnItemId, WarehouseId, WarrantyId, WishlistId,
195    };
196}
197
198/// Compiles the code examples in `README.md` as doctests, so the crates.io
199/// landing page can never drift from the real API.
200#[cfg(doctest)]
201#[doc = include_str!("../README.md")]
202struct ReadmeDoctests;