commit a0ae6c4617b4cd9a8bb8282a484b15639e9c89d6
parent 7e8744dab5447b4d1767ac211052fb36941260f7
Author: triesap <tyson@radroots.org>
Date: Mon, 27 Jul 2026 16:59:41 +0000
core: document public api contract
- make the package README the crate-level rustdoc authority
- add checked pricing example and module-level API guidance
- record a pinned, reviewable public API baseline
- refresh governed source-maintenance artifacts and verification
Diffstat:
15 files changed, 1466 insertions(+), 54 deletions(-)
diff --git a/crates/core/README.md b/crates/core/README.md
@@ -1,21 +1,114 @@
# radroots-core
-This is the README for `radroots_core`, which provides core value types and
-unit semantics for the `radroots` core libraries.
+`radroots-core` provides the portable, deterministic value model shared by
+Radroots domain packages: decimals, currencies, money, percentages,
+quantities, units, and pricing.
-## Overview
+The crate supports `no_std` environments with `alloc`. It performs no I/O,
+starts no tasks or threads, reads no clocks or process state, and owns no
+networking or persistence behavior.
- * stable domain value types for currency, money, quantity, quantity pricing,
- percent, discounts, and decimals;
- * unit kinds, dimensions, parsing, and deterministic conversion helpers;
- * portable core semantics for both `std` and `no_std` builds;
- * optional integration with `serde` for serialization.
+## Example
-## Copyright
+Checked constructors and checked pricing operations are the supported trust
+boundary for data received from users, files, databases, or networks:
-Except as otherwise noted, all files in the `radroots_core` distribution are
+```rust
+use radroots_core::pricing::QuantityPriceOps;
+use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit};
- Copyright (c) 2025 Tyson Lupul
+let price = QuantityPrice::try_new(
+ Money::try_new("6.00".parse::<Decimal>()?, Currency::USD)?,
+ Quantity::try_new(Decimal::from(2_u32), Unit::MassKg)?,
+)?;
+let requested = Quantity::try_new(Decimal::from(3_u32), Unit::MassKg)?;
+let total = price.try_cost_for_rounded(&requested)?;
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see LICENSE included in the `radroots_core` distribution.
+assert_eq!(total.amount().to_string(), "9");
+# Ok::<(), radroots_core::Error>(())
+```
+
+The same program is available as the checked
+[`pricing`](examples/checked_pricing.rs) example.
+
+## Public API
+
+The crate root intentionally exports the common value types and aggregate
+[`Error`](https://docs.rs/radroots-core/latest/radroots_core/enum.Error.html).
+Focused errors and operations remain in these modules:
+
+- `currency` — canonical three-letter ASCII currency codes;
+- `decimal` — fixed-precision decimal parsing, conversion, and checked math;
+- `money` — non-negative monetary values and currency-aware quantization;
+- `percent` — signed percentage values and percentage calculations;
+- `pricing` — quantity prices, discounts, and checked pricing operations;
+- `quantity` — non-negative amounts associated with units;
+- `unit` — unit parsing, dimensions, and deterministic conversions.
+
+The normative responsibility and dependency boundary are defined by the
+[`radroots-core` package charter](../../docs/specs/radroots_crates_release_v1.md).
+The reviewed pre-release surface is recorded in
+[`docs/api`](../../docs/api/README.md).
+
+## Features
+
+| Feature | Default | Effect |
+| --- | --- | --- |
+| `std` | yes | Implements `std::error::Error`; value behavior remains portable. |
+| `serde` | yes | Implements canonical serialization and deserialization for public values. |
+
+Disabling default features leaves the `no_std` + `alloc` value model. Features
+are additive; enabling one does not select a runtime, backend, global state, or
+side effect.
+
+## Invariants and untrusted input
+
+Use `try_*`, `checked_*`, parsing, and exact-conversion APIs at trust
+boundaries. They reject negative money or quantities, mismatched currencies or
+units, division by zero, overflow, and lossy exact conversions as applicable.
+Compatibility constructors and operator overloads assume their inputs have
+already been validated and are not the boundary API for untrusted values.
+
+Currency and unit parsers normalize their documented textual spellings.
+Decimal display and serialization normalize insignificant trailing zeroes.
+Pricing quantization uses deterministic currency exponents and documents its
+rounding strategy on the operation that performs the rounding.
+
+The crate forbids unsafe Rust. It does not process credentials, authorize
+actors, or provide confidentiality or authenticity. Callers must impose
+application-specific limits before accepting unbounded collections or text;
+this crate validates value semantics only.
+
+## Serialization
+
+With `serde`, decimal numeric components are encoded as strings so JSON and
+other number-limited formats do not introduce floating-point loss. Currencies
+and units use their canonical string codes; aggregate values use named fields.
+Wire compatibility is governed by the repository conformance vectors.
+
+Deserializing a composite value is not a substitute for boundary validation.
+Call the applicable validator or reconstruct through a checked constructor
+before committing untrusted decoded data.
+
+## Execution and commit semantics
+
+Operations are synchronous and deterministic. There are no asynchronous
+cancellation points, deadlines, retries, callbacks, or partial external side
+effects. A successful call returns its complete value; an error returns before
+any durable commit because the crate owns no durable state. Methods taking
+`&mut self` document whether an error leaves the receiver unchanged.
+
+## Intended consumers
+
+`radroots-core` is intended for lower-level Radroots domain crates and for
+integrators that need the portable value model directly. Applications should
+normally begin with the curated `radroots` crate or the advanced
+`radroots-sdk` composition surface.
+
+The package is pre-1.0. Its durable responsibility and package identity are
+fixed, while API-breaking changes follow the workspace's pre-1.0 versioning
+policy.
+
+## License
+
+Licensed under either Apache-2.0 or MIT, at your option.
diff --git a/crates/core/examples/checked_pricing.rs b/crates/core/examples/checked_pricing.rs
@@ -0,0 +1,14 @@
+use radroots_core::pricing::QuantityPriceOps;
+use radroots_core::{Currency, Decimal, Money, Quantity, QuantityPrice, Unit};
+
+fn main() -> Result<(), radroots_core::Error> {
+ let price = QuantityPrice::try_new(
+ Money::try_new("6.00".parse::<Decimal>()?, Currency::USD)?,
+ Quantity::try_new(Decimal::from(2_u32), Unit::MassKg)?,
+ )?;
+ let requested = Quantity::try_new(Decimal::from(3_u32), Unit::MassKg)?;
+ let total = price.try_cost_for_rounded(&requested)?;
+
+ assert_eq!(total.amount().to_string(), "9");
+ Ok(())
+}
diff --git a/crates/core/src/currency.rs b/crates/core/src/currency.rs
@@ -1,3 +1,5 @@
+//! Canonical three-letter currency codes and currency-specific minor units.
+
use core::fmt;
use core::str::FromStr;
diff --git a/crates/core/src/decimal.rs b/crates/core/src/decimal.rs
@@ -1,3 +1,5 @@
+//! Fixed-precision decimal values, checked arithmetic, and exact conversions.
+
use core::fmt;
use core::ops::{Add, Div, Mul, Sub};
use core::str::FromStr;
diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs
@@ -1,28 +1,4 @@
-//! Portable, deterministic value types for Radroots domain packages.
-//!
-//! Checked constructors and arithmetic preserve value invariants at trust
-//! boundaries:
-//!
-//! ```
-//! use radroots_core::{Currency, Decimal, Money};
-//!
-//! let price = Money::try_new("12.50".parse::<Decimal>()?, Currency::USD)?;
-//! let total = price.checked_mul_decimal(Decimal::from(2_u32))?;
-//! assert_eq!(total.amount().to_string(), "25");
-//! # Ok::<(), radroots_core::Error>(())
-//! ```
-//!
-//! Implementation-only serialization and code-generation modules are not
-//! public API:
-//!
-//! ```compile_fail
-//! use radroots_core::serde_ext;
-//! ```
-//!
-//! ```compile_fail
-//! use radroots_core::dto;
-//! ```
-
+#![doc = include_str!("../README.md")]
#![cfg_attr(not(feature = "std"), no_std)]
#![forbid(unsafe_code)]
#[cfg(not(feature = "std"))]
diff --git a/crates/core/src/money.rs b/crates/core/src/money.rs
@@ -1,3 +1,5 @@
+//! Non-negative monetary values and currency-aware quantization.
+
use core::fmt;
use rust_decimal::Decimal;
use rust_decimal::RoundingStrategy;
diff --git a/crates/core/src/percent.rs b/crates/core/src/percent.rs
@@ -1,3 +1,5 @@
+//! Signed percentage values and deterministic percentage calculations.
+
use core::fmt;
use core::str::FromStr;
diff --git a/crates/core/src/pricing.rs b/crates/core/src/pricing.rs
@@ -1,4 +1,8 @@
-//! Deterministic pricing value objects and operations.
+//! Deterministic quantity pricing, discounts, and checked cost operations.
+//!
+//! Import [`QuantityPriceOps`] to calculate costs. Its `try_*` methods reject
+//! invalid prices, negative quantities, unit mismatches, and arithmetic
+//! overflow without producing a partial result.
pub use crate::discount::{
Discount, DiscountScope, DiscountThreshold, DiscountValue, Error as DiscountError,
diff --git a/crates/core/src/quantity.rs b/crates/core/src/quantity.rs
@@ -1,3 +1,5 @@
+//! Non-negative measured quantities and deterministic unit conversion.
+
use core::fmt;
use crate::Decimal;
diff --git a/crates/core/src/unit.rs b/crates/core/src/unit.rs
@@ -1,3 +1,5 @@
+//! Unit codes, dimensions, parsing, and checked deterministic conversion.
+
use core::fmt;
use core::str::FromStr;
diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.json b/crates/event_store/contracts/source_maintenance_v1.manifest.json
@@ -159,36 +159,36 @@
{
"role": "core_currency_value_authority",
"path": "crates/core/src/currency.rs",
- "byte_length": 4312,
- "sha256": "adfae0ef03de95c2cd3bd7175f32a6c12723dace67b344367fad0f4d4af1e603",
+ "byte_length": 4390,
+ "sha256": "14b73f219a93ae5b70f1c63c93e0bd1a587c0e95c10e7978e855c6a3da204b5c",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "core_decimal_value_authority",
"path": "crates/core/src/decimal.rs",
- "byte_length": 8400,
- "sha256": "93267e36f093ea64e488351bec54c5a142ba94c6de6985f352e9d75419d3e0ab",
+ "byte_length": 8480,
+ "sha256": "9b5bdc52fd13bffb3bd5fd2954c4c37fddc86be1bb7c754bef35bd9442a92381",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "core_money_value_authority",
"path": "crates/core/src/money.rs",
- "byte_length": 9147,
- "sha256": "4f761da36418b2b0b2c909b55b4d80a42d14983b59fc1ebf118862557b527a93",
+ "byte_length": 9214,
+ "sha256": "3377f0ca92f1e66cf6d8cecb88cfd79304113873ef56757eb93cd3e63c2a4eb2",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "core_percent_value_authority",
"path": "crates/core/src/percent.rs",
- "byte_length": 3268,
- "sha256": "4cfe54a631f911947bcc6e3f0d1607214d88009e87669589cf30b1e078bf8ca0",
+ "byte_length": 3341,
+ "sha256": "9c0a87ae035e2f574b1a6ea2844e924c70ce19645becda99508c680b7c4c846f",
"hash_algorithm": "sha256_bytes_v1"
},
{
"role": "core_quantity_value_authority",
"path": "crates/core/src/quantity.rs",
- "byte_length": 8035,
- "sha256": "a8bcfe6b9038d3baf7a833f811cdd7ac467dc670123a156918ab208e901fdaf5",
+ "byte_length": 8108,
+ "sha256": "18237c5b905395dded9682418e05be1844623eef64943dc844fb28b0f4036c97",
"hash_algorithm": "sha256_bytes_v1"
},
{
@@ -201,8 +201,8 @@
{
"role": "core_unit_value_authority",
"path": "crates/core/src/unit.rs",
- "byte_length": 10436,
- "sha256": "fe17fb780c75a18d3b4678d9268726ba97814ed8da7775b65a03724df120560f",
+ "byte_length": 10512,
+ "sha256": "8228766a56d7c12df8a631a4d2878763a6d0095088b409bfd82bc4a9f89608bc",
"hash_algorithm": "sha256_bytes_v1"
},
{
diff --git a/crates/event_store/contracts/source_maintenance_v1.manifest.sha256 b/crates/event_store/contracts/source_maintenance_v1.manifest.sha256
@@ -1 +1 @@
-ecfb3ba4e68e5628d880fd8dfc8f7f1cbbc4123ce1f6510113107210682b38d9
+61d798a43eed84a67c7d37926cfa58b60ad70194910a6bdeef86d88ac0e9bcb1
diff --git a/crates/event_store/src/generated/source_maintenance_manifest.rs b/crates/event_store/src/generated/source_maintenance_manifest.rs
@@ -1,8 +1,8 @@
// @generated by `cargo xtask contract source-maintenance-manifest --write`; do not edit.
-pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 11506,\n \"sha256\": \"af871d7567594f75da8385691297a5ce170f51ae54c4c318db10b99d458a3335\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4312,\n \"sha256\": \"adfae0ef03de95c2cd3bd7175f32a6c12723dace67b344367fad0f4d4af1e603\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 8400,\n \"sha256\": \"93267e36f093ea64e488351bec54c5a142ba94c6de6985f352e9d75419d3e0ab\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 9147,\n \"sha256\": \"4f761da36418b2b0b2c909b55b4d80a42d14983b59fc1ebf118862557b527a93\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 3268,\n \"sha256\": \"4cfe54a631f911947bcc6e3f0d1607214d88009e87669589cf30b1e078bf8ca0\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 8035,\n \"sha256\": \"a8bcfe6b9038d3baf7a833f811cdd7ac467dc670123a156918ab208e901fdaf5\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 8988,\n \"sha256\": \"0b6fa25c5ad4c7d809bd81cdc2c054f5c4ad9d7963fe0824843df5ce9acddba7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10436,\n \"sha256\": \"fe17fb780c75a18d3b4678d9268726ba97814ed8da7775b65a03724df120560f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 194594,\n \"sha256\": \"4b2961fc69c8204ad5470c0e51c93533063e49d7a14da00a53598c3e8d0cdf6b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 835558,\n \"sha256\": \"51a01360e2c32c83056cb36e22b850e6b09d2ad4e4a749097564b4a100709a16\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 177996,\n \"sha256\": \"c309da38f12101d77c4de1caa49ef443252cac6238b49692182851c2cf894bda\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 500241,\n \"sha256\": \"972e2a6b1099267e11d9a34e73fd38b20fc217a3dd79bd9a0f1f060b680ba2ba\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 14976,\n \"sha256\": \"42b59a8576e4f86b091941a64349ac9eaa20b1e3b52aef367bb3d5947d8ccd1d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n";
+pub(crate) const SOURCE_MAINTENANCE_MANIFEST_JSON: &str = "{\n \"schema_version\": 1,\n \"contract_id\": \"radroots_event_store.source_maintenance_v1\",\n \"hook_id\": \"source_maintenance_v1\",\n \"manifest_schema\": {\n \"path\": \"crates/event_store/contracts/source_maintenance_v1.manifest.schema.json\",\n \"byte_length\": 12315,\n \"sha256\": \"ad4a6c8ae9488fc8033792bc6952af04687f312901c1847d8c668a62913bb642\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"predecessor\": {\n \"hook_id\": \"food_availability_projection_v1\",\n \"manifest\": {\n \"path\": \"crates/event_store/contracts/food_availability_projection_v1.manifest.json\",\n \"byte_length\": 17455,\n \"sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n },\n \"migration\": {\n \"version\": 4,\n \"name\": \"source_maintenance\",\n \"up\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.up.sql\",\n \"byte_length\": 19841,\n \"sha256\": \"425dc799f392b87f265a6fb81f89c4a1c7a5db8391ab0380970708cb9c66704d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"down\": {\n \"path\": \"crates/event_store/migrations/0004_source_maintenance.down.sql\",\n \"byte_length\": 5172,\n \"sha256\": \"fe44fd53c51545c08ea479b385e6781079dab70fc63da2a3c205d727a00ce860\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n \"schema_sha256\": \"d526d96ea02be12b4b0aed99e97cfdde17c4474ace67111506a7b900ee78b186\",\n \"catalog\": {\n \"objects\": [\n \"radroots_event_store_source_capacity_delete_guard\",\n \"radroots_event_store_source_capacity_insert_guard\",\n \"radroots_event_store_source_capacity_marker_close_guard\",\n \"radroots_event_store_source_capacity_update_guard\",\n \"radroots_event_store_source_capacity_v1\",\n \"radroots_event_store_source_generation_capacity_advance\",\n \"radroots_event_store_source_generation_capacity_guard\"\n ],\n \"replaced_objects\": [\n \"radroots_event_store_food_availability_image_delete_guard\",\n \"radroots_event_store_food_availability_projection_delete_guard\",\n \"radroots_event_store_source_rebuild_marker_insert_guard\"\n ],\n \"tables\": [\n \"radroots_event_store_source_capacity_v1\"\n ],\n \"fts5_tables\": []\n }\n },\n \"source_maintenance\": {\n \"version\": 1,\n \"event_contract_registry_version\": 7,\n \"capacity_authority_id\": \"radroots_event_store_source_capacity_v1\",\n \"accounting\": {\n \"algorithm\": \"sqlite_cast_blob_octet_sum_v1\",\n \"raw_event_columns\": [\n \"event_id\",\n \"pubkey\",\n \"tags_json\",\n \"content\",\n \"sig\",\n \"raw_json\"\n ],\n \"raw_tag_columns\": [\n \"event_id\",\n \"tag_name\",\n \"tag_value\",\n \"tag_json\"\n ],\n \"nullable_raw_tag_columns\": [\n \"tag_value\"\n ]\n },\n \"limits\": {\n \"raw_events\": 25000,\n \"raw_tags\": 250000,\n \"raw_event_text_bytes\": 67108864,\n \"raw_tag_text_bytes\": 33554432,\n \"retained_source_generations\": 8\n },\n \"reopen_validation\": {\n \"mode\": \"bounded_full_raw_recount_v1\",\n \"raw_event_rejection_scan_bound\": 25001,\n \"raw_tag_rejection_scan_bound\": 250001,\n \"generation_history_validation\": \"bounded_count_plus_active_ordinal_v1\",\n \"retained_generation_rejection_scan_bound\": 9\n },\n \"rebuild_seal\": {\n \"nip09_hook_id\": \"nip09_reconciliation_v1\",\n \"nip09_manifest_sha256\": \"74af832420ffbaa9805e89df3c0b34f126a443e1598f757e3372f407f9003b77\",\n \"food_hook_id\": \"food_availability_projection_v1\",\n \"food_manifest_sha256\": \"33b93a3c87ce428e8aa6f5e92643c77203d9aa006c53ce96f3562fe6d68ffd23\",\n \"food_scope_fingerprint_sha256\": \"8b63c5ddc48a2cc7db69295238b96d5f814dba50427c80b4d0079f061e6d3de0\",\n \"active_generation_authority\": \"radroots_event_store_source_state\",\n \"marker_close_authority\": \"radroots_event_store_source_capacity_marker_close_guard\"\n }\n },\n \"entry_points\": [\n {\n \"role\": \"migration_registry\",\n \"rust_path\": \"radroots_event_store::migrations::EVENT_STORE_MIGRATIONS[3]\"\n },\n {\n \"role\": \"migration_apply_hook\",\n \"rust_path\": \"radroots_event_store::schema::apply_migration_hook\"\n },\n {\n \"role\": \"migration_validation_hook\",\n \"rust_path\": \"radroots_event_store::schema::validate_migration_hook_state\"\n },\n {\n \"role\": \"capacity_query\",\n \"rust_path\": \"radroots_event_store::RadrootsEventStore::source_capacity_v1\"\n },\n {\n \"role\": \"raw_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_unique_raw_source_append_v1\"\n },\n {\n \"role\": \"raw_append_advance\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::advance_source_capacity_after_insert_v1\"\n },\n {\n \"role\": \"generation_append_preflight\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::preflight_source_generation_append_v1\"\n },\n {\n \"role\": \"generation_rebuild_bind\",\n \"rust_path\": \"radroots_event_store::source_maintenance_v1::bind_source_capacity_to_generation_v1\"\n },\n {\n \"role\": \"sqlite_encoding_preflight\",\n \"rust_path\": \"radroots_event_store::store::validate_main_database_encoding\"\n },\n {\n \"role\": \"source_generation_history_rollback_guard\",\n \"rust_path\": \"radroots_event_store::schema::validate_rollback_preserves_source_generation_history\"\n },\n {\n \"role\": \"result_vector_executor\",\n \"rust_path\": \"source_maintenance_v1_result_vector\"\n }\n ],\n \"source_files\": [\n {\n \"role\": \"workspace_dependency_authority\",\n \"path\": \"Cargo.toml\",\n \"byte_length\": 11506,\n \"sha256\": \"af871d7567594f75da8385691297a5ce170f51ae54c4c318db10b99d458a3335\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_currency_value_authority\",\n \"path\": \"crates/core/src/currency.rs\",\n \"byte_length\": 4390,\n \"sha256\": \"14b73f219a93ae5b70f1c63c93e0bd1a587c0e95c10e7978e855c6a3da204b5c\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_decimal_value_authority\",\n \"path\": \"crates/core/src/decimal.rs\",\n \"byte_length\": 8480,\n \"sha256\": \"9b5bdc52fd13bffb3bd5fd2954c4c37fddc86be1bb7c754bef35bd9442a92381\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_money_value_authority\",\n \"path\": \"crates/core/src/money.rs\",\n \"byte_length\": 9214,\n \"sha256\": \"3377f0ca92f1e66cf6d8cecb88cfd79304113873ef56757eb93cd3e63c2a4eb2\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_percent_value_authority\",\n \"path\": \"crates/core/src/percent.rs\",\n \"byte_length\": 3341,\n \"sha256\": \"9c0a87ae035e2f574b1a6ea2844e924c70ce19645becda99508c680b7c4c846f\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_value_authority\",\n \"path\": \"crates/core/src/quantity.rs\",\n \"byte_length\": 8108,\n \"sha256\": \"18237c5b905395dded9682418e05be1844623eef64943dc844fb28b0f4036c97\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_quantity_price_value_authority\",\n \"path\": \"crates/core/src/quantity_price.rs\",\n \"byte_length\": 8988,\n \"sha256\": \"0b6fa25c5ad4c7d809bd81cdc2c054f5c4ad9d7963fe0824843df5ce9acddba7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"core_unit_value_authority\",\n \"path\": \"crates/core/src/unit.rs\",\n \"byte_length\": 10512,\n \"sha256\": \"8228766a56d7c12df8a631a4d2878763a6d0095088b409bfd82bc4a9f89608bc\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"event_store_error_and_limits\",\n \"path\": \"crates/event_store/src/error.rs\",\n \"byte_length\": 19421,\n \"sha256\": \"4772e041cb20a4963afb2f3159804c777e2f2be61bfdb6ee267e7a7c04258972\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"generated_descriptor_registration\",\n \"path\": \"crates/event_store/src/generated.rs\",\n \"byte_length\": 144,\n \"sha256\": \"6b0a8d6f249bd4fc3f878d37cb5e418680f0f1be2d9eec2518dedf03efc47121\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_surface\",\n \"path\": \"crates/event_store/src/lib.rs\",\n \"byte_length\": 3844,\n \"sha256\": \"3cd9653bcb752fb3c4442d4904b98a0a6208011a9a238125b7b7073d7f4e312b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"migration_registry\",\n \"path\": \"crates/event_store/src/migrations.rs\",\n \"byte_length\": 73585,\n \"sha256\": \"a47477d04759ec6e71d14d3d05459864eae78fce0e3c2481a1b03147f04637f7\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_model_public_surface\",\n \"path\": \"crates/event_store/src/model.rs\",\n \"byte_length\": 33617,\n \"sha256\": \"79296b8f263aa06d17005795e4515f769f064ea6fd971eeb1296e1151debaf20\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_generation_rebuild_authority\",\n \"path\": \"crates/event_store/src/nip09/reconciliation_v1.rs\",\n \"byte_length\": 184407,\n \"sha256\": \"c455d40fc736e3db264f567c7809af7bd897d89be8a33dfb21667a6ef6b8d6c6\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"schema_migration_and_reopen_authority\",\n \"path\": \"crates/event_store/src/schema.rs\",\n \"byte_length\": 146146,\n \"sha256\": \"93b060e80d3edd73f86208e4bf698fa9d53eaf1eeb04526c9261fb8b5726fb0d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"public_store_and_transaction_authority\",\n \"path\": \"crates/event_store/src/store.rs\",\n \"byte_length\": 394574,\n \"sha256\": \"db57dc3e35e64c7194683142fe55edba853671a829269449dd2273056dfc3a0e\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"raw_ingest_capacity_authority\",\n \"path\": \"crates/event_store/src/store/protocol_reconciliation_v1.rs\",\n \"byte_length\": 30140,\n \"sha256\": \"210112eeaa6975a3b4fbb97d5c52588f8c6d8d07975e531d39737fd11235de51\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_runtime\",\n \"path\": \"crates/event_store/src/source_maintenance_v1.rs\",\n \"byte_length\": 51756,\n \"sha256\": \"f8d5b62f0613104aa86658d5bf1baade92c7df83f00ef0cddadd734b9797afca\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"artifact_transaction_authority\",\n \"path\": \"tools/xtask/src/contract/artifact_bundle.rs\",\n \"byte_length\": 38279,\n \"sha256\": \"f326ea57b56d40135f95b6b1e15961f66eed363337180a6d12a5ea903e1a9a29\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"predecessor_successor_governance\",\n \"path\": \"tools/xtask/src/contract/food_availability_projection.rs\",\n \"byte_length\": 194594,\n \"sha256\": \"4b2961fc69c8204ad5470c0e51c93533063e49d7a14da00a53598c3e8d0cdf6b\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"transitive_predecessor_membership_governance\",\n \"path\": \"tools/xtask/src/contract/nip09_reconciliation.rs\",\n \"byte_length\": 835558,\n \"sha256\": \"51a01360e2c32c83056cb36e22b850e6b09d2ad4e4a749097564b4a100709a16\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"source_maintenance_governance\",\n \"path\": \"tools/xtask/src/contract/source_maintenance.rs\",\n \"byte_length\": 177996,\n \"sha256\": \"c309da38f12101d77c4de1caa49ef443252cac6238b49692182851c2cf894bda\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"contract_command_authority\",\n \"path\": \"tools/xtask/src/contract.rs\",\n \"byte_length\": 500241,\n \"sha256\": \"972e2a6b1099267e11d9a34e73fd38b20fc217a3dd79bd9a0f1f060b680ba2ba\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n },\n {\n \"role\": \"xtask_dispatch_and_release_preflight\",\n \"path\": \"tools/xtask/src/main.rs\",\n \"byte_length\": 14976,\n \"sha256\": \"42b59a8576e4f86b091941a64349ac9eaa20b1e3b52aef367bb3d5947d8ccd1d\",\n \"hash_algorithm\": \"sha256_bytes_v1\"\n }\n ],\n \"public_api\": {\n \"inherited_predecessor_symbols\": [\n \"RADROOTS_ADDRESSABLE_TRANSITION_CURSOR_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_D_TAG_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_FEED_VERSION_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_LIMIT_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_RAW_JSON_MAX_BYTES_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_PAGE_SCAN_MAX_V1\",\n \"RADROOTS_ADDRESSABLE_TRANSITION_SCOPE_KIND_MAX_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_APPLY_PAGE_LIMIT_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_PROJECTION_VERSION_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_BYTES_V1\",\n \"RADROOTS_FOOD_AVAILABILITY_SEARCH_QUERY_MAX_TERMS_V1\",\n \"RadrootsAddressableTransitionCauseV1\",\n \"RadrootsAddressableTransitionCoordinateV1\",\n \"RadrootsAddressableTransitionCursorV1\",\n \"RadrootsAddressableTransitionEventReferenceV1\",\n \"RadrootsAddressableTransitionOriginV1\",\n \"RadrootsAddressableTransitionPageV1\",\n \"RadrootsAddressableTransitionRawHeadDecisionV1\",\n \"RadrootsAddressableTransitionScopeFingerprintV1\",\n \"RadrootsAddressableTransitionScopeV1\",\n \"RadrootsAddressableTransitionV1\",\n \"RadrootsAddressableTransitionVisibilityV1\",\n \"RadrootsCurrentEventVisibilityV1\",\n \"RadrootsCurrentVisibilityDecisionV1\",\n \"RadrootsFoodAvailabilitySearchQueryV1\",\n \"RadrootsFoodAvailabilityStatusFilterV1\",\n \"RadrootsNip09SuppressionEvidenceV1\",\n \"RadrootsNip09SuppressionOutcome\",\n \"RadrootsNip09SuppressionReason\",\n \"RadrootsStoreProducedCanonicalEventV1\",\n \"RadrootsStoredFoodAvailabilityImageV1\",\n \"RadrootsStoredFoodAvailabilityV1\"\n ],\n \"added_symbols\": [\n \"RADROOTS_EVENT_STORE_RAW_EVENT_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_EVENT_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_COUNT_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RAW_TAG_TEXT_BYTES_LIMIT_V1\",\n \"RADROOTS_EVENT_STORE_RETAINED_SOURCE_GENERATION_LIMIT_V1\",\n \"RadrootsEventStoreSourceCapacityResourceV1\",\n \"RadrootsEventStoreSourceCapacityV1\"\n ],\n \"methods\": [\n \"RadrootsEventStore::source_capacity_v1\",\n \"RadrootsEventStoreSourceCapacityResourceV1::as_str\",\n \"RadrootsEventStoreSourceCapacityV1::source_generation\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_count\",\n \"RadrootsEventStoreSourceCapacityV1::raw_event_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_tag_text_bytes\",\n \"RadrootsEventStoreSourceCapacityV1::raw_high_water_seq\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_count\",\n \"RadrootsEventStoreSourceCapacityV1::retained_generation_limit\"\n ],\n \"error_variants\": [\n \"SourceCapacityExceeded\",\n \"SourceGenerationHistoryLimitReached\",\n \"PersistedEphemeralRawEvent\",\n \"SourceCapacityStateDrift\",\n \"SqliteMainDatabaseEncodingNotUtf8\",\n \"RollbackWouldDiscardSourceGenerationHistory\"\n ],\n \"removed_symbols\": [\n \"RadrootsEventStoreReconciliationResource\",\n \"RadrootsEventStoreError::ReconciliationCapacityExceeded\"\n ],\n \"breaking_replacements\": [\n {\n \"removed\": \"RadrootsEventStoreReconciliationResource\",\n \"replacement\": \"RadrootsEventStoreSourceCapacityResourceV1\"\n },\n {\n \"removed\": \"RadrootsEventStoreError::ReconciliationCapacityExceeded\",\n \"replacement\": \"RadrootsEventStoreError::SourceCapacityExceeded\"\n }\n ]\n },\n \"result_vector\": {\n \"canonical_path\": \"contracts/conformance/vectors/event_store/source_maintenance.v1.json\",\n \"mirror_path\": \"crates/event_store/tests/fixtures/source_maintenance.v1.json\",\n \"byte_length\": 16253,\n \"sha256\": \"997aba2604a2b9d199fb87dc9d07942ca50d91863aeadcf3eeacf16d191dd71f\",\n \"hash_algorithm\": \"sha256_bytes_v1\",\n \"executor_id\": \"radroots_event_store.source_maintenance_v1.result_vector_executor.v1\",\n \"executor_path\": \"crates/event_store/tests/source_maintenance_v1_result_vector.rs\",\n \"executor_test\": \"source_maintenance_v1_result_vector\",\n \"executor_byte_length\": 23510,\n \"executor_sha256\": \"a7487afdfe19fc5fc794811d0f0e6035203e1aabcf0a33a1d398f6b3555d38f3\",\n \"executor_hash_algorithm\": \"sha256_bytes_v1\"\n }\n}\n";
pub(crate) const SOURCE_MAINTENANCE_MANIFEST_BYTE_LENGTH: usize = 16260;
pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SHA256: &str =
- "ecfb3ba4e68e5628d880fd8dfc8f7f1cbbc4123ce1f6510113107210682b38d9";
+ "61d798a43eed84a67c7d37926cfa58b60ad70194910a6bdeef86d88ac0e9bcb1";
pub(crate) const SOURCE_MAINTENANCE_MANIFEST_SCHEMA_VERSION: u32 = 1;
pub(crate) const SOURCE_MAINTENANCE_CONTRACT_ID: &str =
"radroots_event_store.source_maintenance_v1";
diff --git a/docs/api/README.md b/docs/api/README.md
@@ -0,0 +1,33 @@
+# Public API baselines
+
+This directory records reviewed pre-release public API surfaces for publishable
+Radroots packages. Baselines are generated with `cargo-public-api` `0.52.0`,
+`nightly-2026-07-16` for rustdoc JSON, and the package's complete public feature
+set. Package verification remains governed by the workspace's pinned stable
+toolchain.
+
+Regenerate a package baseline from the workspace root inside the canonical
+development shell with:
+
+```sh
+RUSTC="$(rustup which --toolchain nightly-2026-07-16 rustc)" \
+RUSTDOC="$(rustup which --toolchain nightly-2026-07-16 rustdoc)" \
+cargo public-api --manifest-path crates/<crate>/Cargo.toml \
+ --all-features -sss \
+ > docs/api/<package>.txt
+```
+
+Install the exact tool version, when it is not already available, with:
+
+```sh
+cargo install cargo-public-api --version 0.52.0 --locked
+rustup toolchain install nightly-2026-07-16 --profile minimal
+```
+
+Review baseline changes together with the package charter and intended SemVer
+impact. A generated listing is evidence of the Rust surface, not authority to
+expand a package beyond its charter.
+
+| Package | Baseline | Charter |
+| --- | --- | --- |
+| `radroots-core` | [`radroots-core.txt`](radroots-core.txt) | [release V1 specification](../specs/radroots_crates_release_v1.md) |
diff --git a/docs/api/radroots-core.txt b/docs/api/radroots-core.txt
@@ -0,0 +1,1280 @@
+pub mod radroots_core
+pub mod radroots_core::currency
+#[non_exhaustive] pub enum radroots_core::currency::ParseError
+pub radroots_core::currency::ParseError::InvalidFormat
+impl core::convert::From<radroots_core::currency::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::currency::ParseError) -> Self
+impl core::error::Error for radroots_core::currency::ParseError
+impl core::fmt::Display for radroots_core::currency::ParseError
+pub fn radroots_core::currency::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::currency::RadrootsCoreCurrencyParseError
+pub radroots_core::currency::RadrootsCoreCurrencyParseError::InvalidFormat
+impl core::convert::From<radroots_core::currency::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::currency::ParseError) -> Self
+impl core::error::Error for radroots_core::currency::ParseError
+impl core::fmt::Display for radroots_core::currency::ParseError
+pub fn radroots_core::currency::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::currency::Currency(_)
+impl radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::AUD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::CAD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::EUR: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::GBP: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::JPY: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::USD: radroots_core::currency::Currency
+pub const fn radroots_core::currency::Currency::as_bytes(&self) -> &[u8; 3]
+pub fn radroots_core::currency::Currency::as_str(&self) -> &str
+pub const fn radroots_core::currency::Currency::from_const([u8; 3]) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub fn radroots_core::currency::Currency::from_str_upper(&str) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub const fn radroots_core::currency::Currency::minor_unit_exponent(&self) -> u32
+impl core::convert::TryFrom<&str> for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Error = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::try_from(&str) -> core::result::Result<Self, Self::Error>
+impl core::fmt::Debug for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::fmt::Display for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Err = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::currency::RadrootsCoreCurrency(_)
+impl radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::AUD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::CAD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::EUR: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::GBP: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::JPY: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::USD: radroots_core::currency::Currency
+pub const fn radroots_core::currency::Currency::as_bytes(&self) -> &[u8; 3]
+pub fn radroots_core::currency::Currency::as_str(&self) -> &str
+pub const fn radroots_core::currency::Currency::from_const([u8; 3]) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub fn radroots_core::currency::Currency::from_str_upper(&str) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub const fn radroots_core::currency::Currency::minor_unit_exponent(&self) -> u32
+impl core::convert::TryFrom<&str> for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Error = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::try_from(&str) -> core::result::Result<Self, Self::Error>
+impl core::fmt::Debug for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::fmt::Display for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Err = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub mod radroots_core::decimal
+#[non_exhaustive] pub enum radroots_core::decimal::Error
+pub radroots_core::decimal::Error::ArithmeticOverflow
+pub radroots_core::decimal::Error::DivisionByZero
+pub radroots_core::decimal::Error::InvalidFormat
+pub radroots_core::decimal::Error::OutOfRange
+pub radroots_core::decimal::Error::PrecisionLoss
+pub radroots_core::decimal::Error::ScaleOutOfRange
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::money::Error
+pub fn radroots_core::money::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::from(radroots_core::decimal::Error) -> Self
+impl core::error::Error for radroots_core::decimal::Error
+impl core::fmt::Display for radroots_core::decimal::Error
+pub fn radroots_core::decimal::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::decimal::Decimal(pub rust_decimal::decimal::Decimal)
+impl radroots_core::decimal::Decimal
+pub const radroots_core::decimal::Decimal::MAX: Self
+pub const radroots_core::decimal::Decimal::MAX_SCALE: u32
+pub const radroots_core::decimal::Decimal::MIN: Self
+pub const radroots_core::decimal::Decimal::ONE: Self
+pub const radroots_core::decimal::Decimal::ZERO: Self
+pub fn radroots_core::decimal::Decimal::checked_add(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_div(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_mul(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_sub(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_f64_display(f64) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_str_exact(&str) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::is_sign_negative(&self) -> bool
+pub fn radroots_core::decimal::Decimal::is_zero(&self) -> bool
+pub fn radroots_core::decimal::Decimal::normalize(&self) -> rust_decimal::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::rescale(&mut self, u32)
+pub fn radroots_core::decimal::Decimal::scale(&self) -> u32
+pub fn radroots_core::decimal::Decimal::to_f64_lossy(&self) -> core::option::Option<f64>
+pub fn radroots_core::decimal::Decimal::to_u64_exact(&self) -> core::option::Option<u64>
+pub fn radroots_core::decimal::Decimal::try_rescale_exact(&mut self, u32) -> core::result::Result<(), radroots_core::decimal::Error>
+impl core::convert::From<i32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i32) -> Self
+impl core::convert::From<i64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i64) -> Self
+impl core::convert::From<radroots_core::decimal::Decimal> for rust_decimal::decimal::Decimal
+pub fn rust_decimal::decimal::Decimal::from(radroots_core::decimal::Decimal) -> Self
+impl core::convert::From<rust_decimal::decimal::Decimal> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(rust_decimal::decimal::Decimal) -> Self
+impl core::convert::From<u32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u32) -> Self
+impl core::convert::From<u64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u64) -> Self
+impl core::fmt::Display for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Add for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::add(self, Self) -> Self
+impl core::ops::arith::Div for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::div(self, Self) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::mul(self, Self) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Sub for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::sub(self, Self) -> Self
+impl core::str::traits::FromStr for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Err = radroots_core::decimal::Error
+pub fn radroots_core::decimal::Decimal::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::decimal::RadrootsCoreDecimal(pub rust_decimal::decimal::Decimal)
+impl radroots_core::decimal::Decimal
+pub const radroots_core::decimal::Decimal::MAX: Self
+pub const radroots_core::decimal::Decimal::MAX_SCALE: u32
+pub const radroots_core::decimal::Decimal::MIN: Self
+pub const radroots_core::decimal::Decimal::ONE: Self
+pub const radroots_core::decimal::Decimal::ZERO: Self
+pub fn radroots_core::decimal::Decimal::checked_add(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_div(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_mul(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_sub(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_f64_display(f64) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_str_exact(&str) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::is_sign_negative(&self) -> bool
+pub fn radroots_core::decimal::Decimal::is_zero(&self) -> bool
+pub fn radroots_core::decimal::Decimal::normalize(&self) -> rust_decimal::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::rescale(&mut self, u32)
+pub fn radroots_core::decimal::Decimal::scale(&self) -> u32
+pub fn radroots_core::decimal::Decimal::to_f64_lossy(&self) -> core::option::Option<f64>
+pub fn radroots_core::decimal::Decimal::to_u64_exact(&self) -> core::option::Option<u64>
+pub fn radroots_core::decimal::Decimal::try_rescale_exact(&mut self, u32) -> core::result::Result<(), radroots_core::decimal::Error>
+impl core::convert::From<i32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i32) -> Self
+impl core::convert::From<i64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i64) -> Self
+impl core::convert::From<radroots_core::decimal::Decimal> for rust_decimal::decimal::Decimal
+pub fn rust_decimal::decimal::Decimal::from(radroots_core::decimal::Decimal) -> Self
+impl core::convert::From<rust_decimal::decimal::Decimal> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(rust_decimal::decimal::Decimal) -> Self
+impl core::convert::From<u32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u32) -> Self
+impl core::convert::From<u64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u64) -> Self
+impl core::fmt::Display for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Add for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::add(self, Self) -> Self
+impl core::ops::arith::Div for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::div(self, Self) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::mul(self, Self) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Sub for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::sub(self, Self) -> Self
+impl core::str::traits::FromStr for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Err = radroots_core::decimal::Error
+pub fn radroots_core::decimal::Decimal::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub mod radroots_core::money
+#[non_exhaustive] pub enum radroots_core::money::Error
+pub radroots_core::money::Error::AmountOverflow
+pub radroots_core::money::Error::ArithmeticOverflow
+pub radroots_core::money::Error::CurrencyMismatch
+pub radroots_core::money::Error::DivisionByZero
+pub radroots_core::money::Error::NegativeAmount
+pub radroots_core::money::Error::NotWholeMinorUnits
+pub radroots_core::money::Error::PrecisionLoss
+pub radroots_core::money::Error::ScaleOutOfRange
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::money::Error
+pub fn radroots_core::money::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::money::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::money::Error) -> Self
+impl core::error::Error for radroots_core::money::Error
+impl core::fmt::Display for radroots_core::money::Error
+pub fn radroots_core::money::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::money::RadrootsCoreMoneyInvariantError
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::AmountOverflow
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::ArithmeticOverflow
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::CurrencyMismatch
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::DivisionByZero
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::NegativeAmount
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::NotWholeMinorUnits
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::PrecisionLoss
+pub radroots_core::money::RadrootsCoreMoneyInvariantError::ScaleOutOfRange
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::money::Error
+pub fn radroots_core::money::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::money::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::money::Error) -> Self
+impl core::error::Error for radroots_core::money::Error
+impl core::fmt::Display for radroots_core::money::Error
+pub fn radroots_core::money::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::money::Money
+pub radroots_core::money::Money::amount: radroots_core::decimal::Decimal
+pub radroots_core::money::Money::currency: radroots_core::currency::Currency
+impl radroots_core::money::Money
+pub const fn radroots_core::money::Money::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::money::Money::checked_add(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_sub(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub const fn radroots_core::money::Money::currency(&self) -> radroots_core::currency::Currency
+pub fn radroots_core::money::Money::div_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::money::Error>
+pub fn radroots_core::money::Money::from_minor_units_u32(u32, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::from_minor_units_u64(u64, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::is_zero(&self) -> bool
+pub fn radroots_core::money::Money::mul_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency(self) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency_with_strategy(self, rust_decimal::decimal::RoundingStrategy) -> Self
+pub fn radroots_core::money::Money::to_minor_units_u32_exact(&self) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u32_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_exact(&self) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_with_scale_exact(self, u32) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::with_scale(self, u32) -> Self
+pub fn radroots_core::money::Money::zero(radroots_core::currency::Currency) -> Self
+impl core::fmt::Display for radroots_core::money::Money
+pub fn radroots_core::money::Money::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+pub struct radroots_core::money::RadrootsCoreMoney
+pub radroots_core::money::RadrootsCoreMoney::amount: radroots_core::decimal::Decimal
+pub radroots_core::money::RadrootsCoreMoney::currency: radroots_core::currency::Currency
+impl radroots_core::money::Money
+pub const fn radroots_core::money::Money::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::money::Money::checked_add(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_sub(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub const fn radroots_core::money::Money::currency(&self) -> radroots_core::currency::Currency
+pub fn radroots_core::money::Money::div_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::money::Error>
+pub fn radroots_core::money::Money::from_minor_units_u32(u32, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::from_minor_units_u64(u64, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::is_zero(&self) -> bool
+pub fn radroots_core::money::Money::mul_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency(self) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency_with_strategy(self, rust_decimal::decimal::RoundingStrategy) -> Self
+pub fn radroots_core::money::Money::to_minor_units_u32_exact(&self) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u32_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_exact(&self) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_with_scale_exact(self, u32) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::with_scale(self, u32) -> Self
+pub fn radroots_core::money::Money::zero(radroots_core::currency::Currency) -> Self
+impl core::fmt::Display for radroots_core::money::Money
+pub fn radroots_core::money::Money::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+pub mod radroots_core::percent
+#[non_exhaustive] pub enum radroots_core::percent::ParseError
+pub radroots_core::percent::ParseError::InvalidNumber
+impl core::convert::From<radroots_core::percent::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::percent::ParseError) -> Self
+impl core::error::Error for radroots_core::percent::ParseError
+impl core::fmt::Display for radroots_core::percent::ParseError
+pub fn radroots_core::percent::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::percent::RadrootsCorePercentParseError
+pub radroots_core::percent::RadrootsCorePercentParseError::InvalidNumber
+impl core::convert::From<radroots_core::percent::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::percent::ParseError) -> Self
+impl core::error::Error for radroots_core::percent::ParseError
+impl core::fmt::Display for radroots_core::percent::ParseError
+pub fn radroots_core::percent::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::percent::Percent
+pub radroots_core::percent::Percent::value: radroots_core::decimal::Decimal
+impl radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::from_ratio(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::new(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::of_money(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::of_money_quantized(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::to_ratio(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::percent::Percent::try_from_ratio(radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::percent::Percent::try_of_money(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_of_money_quantized(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_to_ratio(&self) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::decimal::Error>
+impl core::fmt::Display for radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::percent::Percent
+pub type radroots_core::percent::Percent::Err = radroots_core::percent::ParseError
+pub fn radroots_core::percent::Percent::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub struct radroots_core::percent::RadrootsCorePercent
+pub radroots_core::percent::RadrootsCorePercent::value: radroots_core::decimal::Decimal
+impl radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::from_ratio(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::new(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::of_money(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::of_money_quantized(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::to_ratio(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::percent::Percent::try_from_ratio(radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::percent::Percent::try_of_money(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_of_money_quantized(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_to_ratio(&self) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::decimal::Error>
+impl core::fmt::Display for radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::percent::Percent
+pub type radroots_core::percent::Percent::Err = radroots_core::percent::ParseError
+pub fn radroots_core::percent::Percent::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub mod radroots_core::pricing
+#[non_exhaustive] pub enum radroots_core::pricing::DiscountError
+pub radroots_core::pricing::DiscountError::NegativeThreshold
+pub radroots_core::pricing::DiscountError::NegativeValue
+impl core::convert::From<radroots_core::pricing::DiscountError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::pricing::DiscountError) -> Self
+impl core::error::Error for radroots_core::pricing::DiscountError
+impl core::fmt::Display for radroots_core::pricing::DiscountError
+pub fn radroots_core::pricing::DiscountError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::pricing::DiscountScope
+pub radroots_core::pricing::DiscountScope::Bin
+pub radroots_core::pricing::DiscountScope::OrderTotal
+pub enum radroots_core::pricing::DiscountThreshold
+pub radroots_core::pricing::DiscountThreshold::BinCount
+pub radroots_core::pricing::DiscountThreshold::BinCount::bin_id: alloc::string::String
+pub radroots_core::pricing::DiscountThreshold::BinCount::min: u32
+pub radroots_core::pricing::DiscountThreshold::OrderQuantity
+pub radroots_core::pricing::DiscountThreshold::OrderQuantity::min: radroots_core::quantity::Quantity
+pub enum radroots_core::pricing::DiscountValue
+pub radroots_core::pricing::DiscountValue::MoneyPerBin(radroots_core::money::Money)
+pub radroots_core::pricing::DiscountValue::Percent(radroots_core::percent::Percent)
+pub enum radroots_core::pricing::Error
+pub radroots_core::pricing::Error::ArithmeticOverflow
+pub radroots_core::pricing::Error::NegativePrice
+pub radroots_core::pricing::Error::NegativeRequestedQuantity
+pub radroots_core::pricing::Error::NonConvertibleUnits
+pub radroots_core::pricing::Error::NonConvertibleUnits::from: radroots_core::unit::Unit
+pub radroots_core::pricing::Error::NonConvertibleUnits::to: radroots_core::unit::Unit
+pub radroots_core::pricing::Error::PerQuantityNegative
+pub radroots_core::pricing::Error::PerQuantityZero
+pub radroots_core::pricing::Error::UnitMismatch
+pub radroots_core::pricing::Error::UnitMismatch::have: radroots_core::unit::Unit
+pub radroots_core::pricing::Error::UnitMismatch::want: radroots_core::unit::Unit
+impl core::convert::From<radroots_core::RadrootsCoreQuantityPriceError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::RadrootsCoreQuantityPriceError) -> Self
+impl core::error::Error for radroots_core::RadrootsCoreQuantityPriceError
+impl core::fmt::Display for radroots_core::RadrootsCoreQuantityPriceError
+pub fn radroots_core::RadrootsCoreQuantityPriceError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::pricing::Discount
+pub radroots_core::pricing::Discount::scope: radroots_core::RadrootsCoreDiscountScope
+pub radroots_core::pricing::Discount::threshold: radroots_core::RadrootsCoreDiscountThreshold
+pub radroots_core::pricing::Discount::value: radroots_core::RadrootsCoreDiscountValue
+impl radroots_core::RadrootsCoreDiscount
+pub fn radroots_core::RadrootsCoreDiscount::is_non_negative(&self) -> bool
+pub fn radroots_core::RadrootsCoreDiscount::scope(&self) -> &radroots_core::RadrootsCoreDiscountScope
+pub fn radroots_core::RadrootsCoreDiscount::threshold(&self) -> &radroots_core::RadrootsCoreDiscountThreshold
+pub fn radroots_core::RadrootsCoreDiscount::try_new(radroots_core::RadrootsCoreDiscountScope, radroots_core::RadrootsCoreDiscountThreshold, radroots_core::RadrootsCoreDiscountValue) -> core::result::Result<Self, radroots_core::pricing::DiscountError>
+pub fn radroots_core::RadrootsCoreDiscount::validate(&self) -> core::result::Result<(), radroots_core::pricing::DiscountError>
+pub fn radroots_core::RadrootsCoreDiscount::value(&self) -> &radroots_core::RadrootsCoreDiscountValue
+pub struct radroots_core::pricing::QuantityPrice
+pub radroots_core::pricing::QuantityPrice::amount: radroots_core::money::Money
+pub radroots_core::pricing::QuantityPrice::quantity: radroots_core::quantity::Quantity
+impl radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::amount(&self) -> &radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::is_price_per_canonical_unit(&self) -> bool
+pub fn radroots_core::QuantityPrice::new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> Self
+pub fn radroots_core::QuantityPrice::quantity(&self) -> &radroots_core::quantity::Quantity
+pub fn radroots_core::QuantityPrice::try_cost_for_amount_in(&self, radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_quantity_in(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> core::result::Result<Self, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_canonical_unit_price(&self) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_unit_price(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::validate(&self) -> core::result::Result<(), radroots_core::RadrootsCoreQuantityPriceError>
+impl radroots_core::RadrootsCoreQuantityPriceOps for radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub trait radroots_core::pricing::QuantityPriceOps: radroots_core::quantity_price::sealed::Sealed
+pub fn radroots_core::pricing::QuantityPriceOps::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::pricing::QuantityPriceOps::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::pricing::QuantityPriceOps::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::pricing::QuantityPriceOps::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::pricing::QuantityPriceOps::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+impl radroots_core::RadrootsCoreQuantityPriceOps for radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub mod radroots_core::quantity
+#[non_exhaustive] pub enum radroots_core::quantity::Error
+pub radroots_core::quantity::Error::ArithmeticOverflow
+pub radroots_core::quantity::Error::DivisionByZero
+pub radroots_core::quantity::Error::NegativeAmount
+pub radroots_core::quantity::Error::UnitMismatch
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::quantity::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::quantity::Error) -> Self
+impl core::error::Error for radroots_core::quantity::Error
+impl core::fmt::Display for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::quantity::RadrootsCoreQuantityInvariantError
+pub radroots_core::quantity::RadrootsCoreQuantityInvariantError::ArithmeticOverflow
+pub radroots_core::quantity::RadrootsCoreQuantityInvariantError::DivisionByZero
+pub radroots_core::quantity::RadrootsCoreQuantityInvariantError::NegativeAmount
+pub radroots_core::quantity::RadrootsCoreQuantityInvariantError::UnitMismatch
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::quantity::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::quantity::Error) -> Self
+impl core::error::Error for radroots_core::quantity::Error
+impl core::fmt::Display for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub struct radroots_core::quantity::Quantity
+pub radroots_core::quantity::Quantity::amount: radroots_core::decimal::Decimal
+pub radroots_core::quantity::Quantity::label: core::option::Option<alloc::string::String>
+pub radroots_core::quantity::Quantity::unit: radroots_core::unit::Unit
+impl radroots_core::quantity::Quantity
+pub const fn radroots_core::quantity::Quantity::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::quantity::Quantity::canonical_unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::checked_add(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_sub(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::clear_label(self) -> Self
+pub fn radroots_core::quantity::Quantity::div_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::is_canonical(&self) -> bool
+pub fn radroots_core::quantity::Quantity::is_zero(&self) -> bool
+pub fn radroots_core::quantity::Quantity::label(&self) -> core::option::Option<&str>
+pub fn radroots_core::quantity::Quantity::mul_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> Self
+pub fn radroots_core::quantity::Quantity::to_canonical(&self) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_add(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_convert_to(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<Self, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_sub(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub const fn radroots_core::quantity::Quantity::unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::with_label<S: core::convert::Into<alloc::string::String>>(self, S) -> Self
+pub fn radroots_core::quantity::Quantity::with_optional_label<S: core::convert::Into<alloc::string::String>>(self, core::option::Option<S>) -> Self
+pub fn radroots_core::quantity::Quantity::with_scale(self, u32) -> Self
+pub fn radroots_core::quantity::Quantity::zero(radroots_core::unit::Unit) -> Self
+impl core::fmt::Display for radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub struct radroots_core::quantity::RadrootsCoreQuantity
+pub radroots_core::quantity::RadrootsCoreQuantity::amount: radroots_core::decimal::Decimal
+pub radroots_core::quantity::RadrootsCoreQuantity::label: core::option::Option<alloc::string::String>
+pub radroots_core::quantity::RadrootsCoreQuantity::unit: radroots_core::unit::Unit
+impl radroots_core::quantity::Quantity
+pub const fn radroots_core::quantity::Quantity::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::quantity::Quantity::canonical_unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::checked_add(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_sub(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::clear_label(self) -> Self
+pub fn radroots_core::quantity::Quantity::div_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::is_canonical(&self) -> bool
+pub fn radroots_core::quantity::Quantity::is_zero(&self) -> bool
+pub fn radroots_core::quantity::Quantity::label(&self) -> core::option::Option<&str>
+pub fn radroots_core::quantity::Quantity::mul_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> Self
+pub fn radroots_core::quantity::Quantity::to_canonical(&self) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_add(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_convert_to(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<Self, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_sub(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub const fn radroots_core::quantity::Quantity::unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::with_label<S: core::convert::Into<alloc::string::String>>(self, S) -> Self
+pub fn radroots_core::quantity::Quantity::with_optional_label<S: core::convert::Into<alloc::string::String>>(self, core::option::Option<S>) -> Self
+pub fn radroots_core::quantity::Quantity::with_scale(self, u32) -> Self
+pub fn radroots_core::quantity::Quantity::zero(radroots_core::unit::Unit) -> Self
+impl core::fmt::Display for radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub mod radroots_core::unit
+pub enum radroots_core::unit::ConvertError
+pub radroots_core::unit::ConvertError::ArithmeticOverflow
+pub radroots_core::unit::ConvertError::ArithmeticOverflow::from: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::ArithmeticOverflow::to: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotConvertibleUnits
+pub radroots_core::unit::ConvertError::NotConvertibleUnits::from: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotConvertibleUnits::to: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotMassUnit
+pub radroots_core::unit::ConvertError::NotMassUnit::from: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotMassUnit::to: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotVolumeUnit
+pub radroots_core::unit::ConvertError::NotVolumeUnit::from: radroots_core::unit::Unit
+pub radroots_core::unit::ConvertError::NotVolumeUnit::to: radroots_core::unit::Unit
+impl core::convert::From<radroots_core::unit::ConvertError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ConvertError) -> Self
+impl core::error::Error for radroots_core::unit::ConvertError
+impl core::fmt::Display for radroots_core::unit::ConvertError
+pub fn radroots_core::unit::ConvertError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::unit::ParseError
+pub radroots_core::unit::ParseError::NotAMassUnit
+pub radroots_core::unit::ParseError::NotAVolumeUnit
+pub radroots_core::unit::ParseError::UnknownUnit
+impl core::convert::From<radroots_core::unit::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ParseError) -> Self
+impl core::error::Error for radroots_core::unit::ParseError
+impl core::fmt::Display for radroots_core::unit::ParseError
+pub fn radroots_core::unit::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::unit::RadrootsCoreUnit
+pub radroots_core::unit::RadrootsCoreUnit::Each
+pub radroots_core::unit::RadrootsCoreUnit::MassG
+pub radroots_core::unit::RadrootsCoreUnit::MassKg
+pub radroots_core::unit::RadrootsCoreUnit::MassLb
+pub radroots_core::unit::RadrootsCoreUnit::MassOz
+pub radroots_core::unit::RadrootsCoreUnit::VolumeL
+pub radroots_core::unit::RadrootsCoreUnit::VolumeMl
+impl radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::canonical_unit(&self) -> Self
+pub fn radroots_core::unit::Unit::code(&self) -> &'static str
+pub fn radroots_core::unit::Unit::dimension(&self) -> radroots_core::unit::UnitDimension
+pub fn radroots_core::unit::Unit::is_count(&self) -> bool
+pub fn radroots_core::unit::Unit::is_mass(&self) -> bool
+pub fn radroots_core::unit::Unit::is_volume(&self) -> bool
+pub fn radroots_core::unit::Unit::same_dimension(Self, Self) -> bool
+impl core::fmt::Display for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::unit::Unit
+pub type radroots_core::unit::Unit::Err = radroots_core::unit::ParseError
+pub fn radroots_core::unit::Unit::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub enum radroots_core::unit::RadrootsCoreUnitConvertError
+pub radroots_core::unit::RadrootsCoreUnitConvertError::ArithmeticOverflow
+pub radroots_core::unit::RadrootsCoreUnitConvertError::ArithmeticOverflow::from: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::ArithmeticOverflow::to: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotConvertibleUnits
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotConvertibleUnits::from: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotConvertibleUnits::to: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotMassUnit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotMassUnit::from: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotMassUnit::to: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotVolumeUnit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotVolumeUnit::from: radroots_core::unit::Unit
+pub radroots_core::unit::RadrootsCoreUnitConvertError::NotVolumeUnit::to: radroots_core::unit::Unit
+impl core::convert::From<radroots_core::unit::ConvertError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ConvertError) -> Self
+impl core::error::Error for radroots_core::unit::ConvertError
+impl core::fmt::Display for radroots_core::unit::ConvertError
+pub fn radroots_core::unit::ConvertError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::unit::RadrootsCoreUnitDimension
+pub radroots_core::unit::RadrootsCoreUnitDimension::Count
+pub radroots_core::unit::RadrootsCoreUnitDimension::Mass
+pub radroots_core::unit::RadrootsCoreUnitDimension::Volume
+pub enum radroots_core::unit::RadrootsCoreUnitParseError
+pub radroots_core::unit::RadrootsCoreUnitParseError::NotAMassUnit
+pub radroots_core::unit::RadrootsCoreUnitParseError::NotAVolumeUnit
+pub radroots_core::unit::RadrootsCoreUnitParseError::UnknownUnit
+impl core::convert::From<radroots_core::unit::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ParseError) -> Self
+impl core::error::Error for radroots_core::unit::ParseError
+impl core::fmt::Display for radroots_core::unit::ParseError
+pub fn radroots_core::unit::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::unit::Unit
+pub radroots_core::unit::Unit::Each
+pub radroots_core::unit::Unit::MassG
+pub radroots_core::unit::Unit::MassKg
+pub radroots_core::unit::Unit::MassLb
+pub radroots_core::unit::Unit::MassOz
+pub radroots_core::unit::Unit::VolumeL
+pub radroots_core::unit::Unit::VolumeMl
+impl radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::canonical_unit(&self) -> Self
+pub fn radroots_core::unit::Unit::code(&self) -> &'static str
+pub fn radroots_core::unit::Unit::dimension(&self) -> radroots_core::unit::UnitDimension
+pub fn radroots_core::unit::Unit::is_count(&self) -> bool
+pub fn radroots_core::unit::Unit::is_mass(&self) -> bool
+pub fn radroots_core::unit::Unit::is_volume(&self) -> bool
+pub fn radroots_core::unit::Unit::same_dimension(Self, Self) -> bool
+impl core::fmt::Display for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::unit::Unit
+pub type radroots_core::unit::Unit::Err = radroots_core::unit::ParseError
+pub fn radroots_core::unit::Unit::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub enum radroots_core::unit::UnitDimension
+pub radroots_core::unit::UnitDimension::Count
+pub radroots_core::unit::UnitDimension::Mass
+pub radroots_core::unit::UnitDimension::Volume
+pub fn radroots_core::unit::convert_mass_decimal(radroots_core::decimal::Decimal, radroots_core::unit::Unit, radroots_core::unit::Unit) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::unit::ConvertError>
+pub fn radroots_core::unit::convert_unit_decimal(radroots_core::decimal::Decimal, radroots_core::unit::Unit, radroots_core::unit::Unit) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::unit::ConvertError>
+pub fn radroots_core::unit::convert_volume_decimal(radroots_core::decimal::Decimal, radroots_core::unit::Unit, radroots_core::unit::Unit) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::unit::ConvertError>
+pub fn radroots_core::unit::parse_mass_unit(&str) -> core::result::Result<radroots_core::unit::Unit, radroots_core::unit::ParseError>
+pub fn radroots_core::unit::parse_volume_unit(&str) -> core::result::Result<radroots_core::unit::Unit, radroots_core::unit::ParseError>
+#[non_exhaustive] pub enum radroots_core::Error
+pub radroots_core::Error::Currency(radroots_core::currency::ParseError)
+pub radroots_core::Error::Decimal(radroots_core::decimal::Error)
+pub radroots_core::Error::Discount(radroots_core::pricing::DiscountError)
+pub radroots_core::Error::Money(radroots_core::money::Error)
+pub radroots_core::Error::Percent(radroots_core::percent::ParseError)
+pub radroots_core::Error::Pricing(radroots_core::RadrootsCoreQuantityPriceError)
+pub radroots_core::Error::Quantity(radroots_core::quantity::Error)
+pub radroots_core::Error::UnitConversion(radroots_core::unit::ConvertError)
+pub radroots_core::Error::UnitParse(radroots_core::unit::ParseError)
+impl core::convert::From<radroots_core::RadrootsCoreQuantityPriceError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::RadrootsCoreQuantityPriceError) -> Self
+impl core::convert::From<radroots_core::currency::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::currency::ParseError) -> Self
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::money::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::money::Error) -> Self
+impl core::convert::From<radroots_core::percent::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::percent::ParseError) -> Self
+impl core::convert::From<radroots_core::pricing::DiscountError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::pricing::DiscountError) -> Self
+impl core::convert::From<radroots_core::quantity::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::quantity::Error) -> Self
+impl core::convert::From<radroots_core::unit::ConvertError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ConvertError) -> Self
+impl core::convert::From<radroots_core::unit::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ParseError) -> Self
+impl core::error::Error for radroots_core::Error
+pub fn radroots_core::Error::source(&self) -> core::option::Option<&(dyn core::error::Error + 'static)>
+impl core::fmt::Display for radroots_core::Error
+pub fn radroots_core::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::RadrootsCoreCurrencyParseError
+pub radroots_core::RadrootsCoreCurrencyParseError::InvalidFormat
+impl core::convert::From<radroots_core::currency::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::currency::ParseError) -> Self
+impl core::error::Error for radroots_core::currency::ParseError
+impl core::fmt::Display for radroots_core::currency::ParseError
+pub fn radroots_core::currency::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::RadrootsCoreDiscountScope
+pub radroots_core::RadrootsCoreDiscountScope::Bin
+pub radroots_core::RadrootsCoreDiscountScope::OrderTotal
+pub enum radroots_core::RadrootsCoreDiscountThreshold
+pub radroots_core::RadrootsCoreDiscountThreshold::BinCount
+pub radroots_core::RadrootsCoreDiscountThreshold::BinCount::bin_id: alloc::string::String
+pub radroots_core::RadrootsCoreDiscountThreshold::BinCount::min: u32
+pub radroots_core::RadrootsCoreDiscountThreshold::OrderQuantity
+pub radroots_core::RadrootsCoreDiscountThreshold::OrderQuantity::min: radroots_core::quantity::Quantity
+pub enum radroots_core::RadrootsCoreDiscountValue
+pub radroots_core::RadrootsCoreDiscountValue::MoneyPerBin(radroots_core::money::Money)
+pub radroots_core::RadrootsCoreDiscountValue::Percent(radroots_core::percent::Percent)
+#[non_exhaustive] pub enum radroots_core::RadrootsCoreMoneyInvariantError
+pub radroots_core::RadrootsCoreMoneyInvariantError::AmountOverflow
+pub radroots_core::RadrootsCoreMoneyInvariantError::ArithmeticOverflow
+pub radroots_core::RadrootsCoreMoneyInvariantError::CurrencyMismatch
+pub radroots_core::RadrootsCoreMoneyInvariantError::DivisionByZero
+pub radroots_core::RadrootsCoreMoneyInvariantError::NegativeAmount
+pub radroots_core::RadrootsCoreMoneyInvariantError::NotWholeMinorUnits
+pub radroots_core::RadrootsCoreMoneyInvariantError::PrecisionLoss
+pub radroots_core::RadrootsCoreMoneyInvariantError::ScaleOutOfRange
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::money::Error
+pub fn radroots_core::money::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::money::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::money::Error) -> Self
+impl core::error::Error for radroots_core::money::Error
+impl core::fmt::Display for radroots_core::money::Error
+pub fn radroots_core::money::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::RadrootsCorePercentParseError
+pub radroots_core::RadrootsCorePercentParseError::InvalidNumber
+impl core::convert::From<radroots_core::percent::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::percent::ParseError) -> Self
+impl core::error::Error for radroots_core::percent::ParseError
+impl core::fmt::Display for radroots_core::percent::ParseError
+pub fn radroots_core::percent::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+#[non_exhaustive] pub enum radroots_core::RadrootsCoreQuantityInvariantError
+pub radroots_core::RadrootsCoreQuantityInvariantError::ArithmeticOverflow
+pub radroots_core::RadrootsCoreQuantityInvariantError::DivisionByZero
+pub radroots_core::RadrootsCoreQuantityInvariantError::NegativeAmount
+pub radroots_core::RadrootsCoreQuantityInvariantError::UnitMismatch
+impl core::convert::From<radroots_core::decimal::Error> for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::from(radroots_core::decimal::Error) -> Self
+impl core::convert::From<radroots_core::quantity::Error> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::quantity::Error) -> Self
+impl core::error::Error for radroots_core::quantity::Error
+impl core::fmt::Display for radroots_core::quantity::Error
+pub fn radroots_core::quantity::Error::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::RadrootsCoreQuantityPriceError
+pub radroots_core::RadrootsCoreQuantityPriceError::ArithmeticOverflow
+pub radroots_core::RadrootsCoreQuantityPriceError::NegativePrice
+pub radroots_core::RadrootsCoreQuantityPriceError::NegativeRequestedQuantity
+pub radroots_core::RadrootsCoreQuantityPriceError::NonConvertibleUnits
+pub radroots_core::RadrootsCoreQuantityPriceError::NonConvertibleUnits::from: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreQuantityPriceError::NonConvertibleUnits::to: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreQuantityPriceError::PerQuantityNegative
+pub radroots_core::RadrootsCoreQuantityPriceError::PerQuantityZero
+pub radroots_core::RadrootsCoreQuantityPriceError::UnitMismatch
+pub radroots_core::RadrootsCoreQuantityPriceError::UnitMismatch::have: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreQuantityPriceError::UnitMismatch::want: radroots_core::unit::Unit
+impl core::convert::From<radroots_core::RadrootsCoreQuantityPriceError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::RadrootsCoreQuantityPriceError) -> Self
+impl core::error::Error for radroots_core::RadrootsCoreQuantityPriceError
+impl core::fmt::Display for radroots_core::RadrootsCoreQuantityPriceError
+pub fn radroots_core::RadrootsCoreQuantityPriceError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::RadrootsCoreUnit
+pub radroots_core::RadrootsCoreUnit::Each
+pub radroots_core::RadrootsCoreUnit::MassG
+pub radroots_core::RadrootsCoreUnit::MassKg
+pub radroots_core::RadrootsCoreUnit::MassLb
+pub radroots_core::RadrootsCoreUnit::MassOz
+pub radroots_core::RadrootsCoreUnit::VolumeL
+pub radroots_core::RadrootsCoreUnit::VolumeMl
+impl radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::canonical_unit(&self) -> Self
+pub fn radroots_core::unit::Unit::code(&self) -> &'static str
+pub fn radroots_core::unit::Unit::dimension(&self) -> radroots_core::unit::UnitDimension
+pub fn radroots_core::unit::Unit::is_count(&self) -> bool
+pub fn radroots_core::unit::Unit::is_mass(&self) -> bool
+pub fn radroots_core::unit::Unit::is_volume(&self) -> bool
+pub fn radroots_core::unit::Unit::same_dimension(Self, Self) -> bool
+impl core::fmt::Display for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::unit::Unit
+pub type radroots_core::unit::Unit::Err = radroots_core::unit::ParseError
+pub fn radroots_core::unit::Unit::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub enum radroots_core::RadrootsCoreUnitConvertError
+pub radroots_core::RadrootsCoreUnitConvertError::ArithmeticOverflow
+pub radroots_core::RadrootsCoreUnitConvertError::ArithmeticOverflow::from: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::ArithmeticOverflow::to: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotConvertibleUnits
+pub radroots_core::RadrootsCoreUnitConvertError::NotConvertibleUnits::from: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotConvertibleUnits::to: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotMassUnit
+pub radroots_core::RadrootsCoreUnitConvertError::NotMassUnit::from: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotMassUnit::to: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotVolumeUnit
+pub radroots_core::RadrootsCoreUnitConvertError::NotVolumeUnit::from: radroots_core::unit::Unit
+pub radroots_core::RadrootsCoreUnitConvertError::NotVolumeUnit::to: radroots_core::unit::Unit
+impl core::convert::From<radroots_core::unit::ConvertError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ConvertError) -> Self
+impl core::error::Error for radroots_core::unit::ConvertError
+impl core::fmt::Display for radroots_core::unit::ConvertError
+pub fn radroots_core::unit::ConvertError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::RadrootsCoreUnitDimension
+pub radroots_core::RadrootsCoreUnitDimension::Count
+pub radroots_core::RadrootsCoreUnitDimension::Mass
+pub radroots_core::RadrootsCoreUnitDimension::Volume
+pub enum radroots_core::RadrootsCoreUnitParseError
+pub radroots_core::RadrootsCoreUnitParseError::NotAMassUnit
+pub radroots_core::RadrootsCoreUnitParseError::NotAVolumeUnit
+pub radroots_core::RadrootsCoreUnitParseError::UnknownUnit
+impl core::convert::From<radroots_core::unit::ParseError> for radroots_core::Error
+pub fn radroots_core::Error::from(radroots_core::unit::ParseError) -> Self
+impl core::error::Error for radroots_core::unit::ParseError
+impl core::fmt::Display for radroots_core::unit::ParseError
+pub fn radroots_core::unit::ParseError::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+pub enum radroots_core::Unit
+pub radroots_core::Unit::Each
+pub radroots_core::Unit::MassG
+pub radroots_core::Unit::MassKg
+pub radroots_core::Unit::MassLb
+pub radroots_core::Unit::MassOz
+pub radroots_core::Unit::VolumeL
+pub radroots_core::Unit::VolumeMl
+impl radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::canonical_unit(&self) -> Self
+pub fn radroots_core::unit::Unit::code(&self) -> &'static str
+pub fn radroots_core::unit::Unit::dimension(&self) -> radroots_core::unit::UnitDimension
+pub fn radroots_core::unit::Unit::is_count(&self) -> bool
+pub fn radroots_core::unit::Unit::is_mass(&self) -> bool
+pub fn radroots_core::unit::Unit::is_volume(&self) -> bool
+pub fn radroots_core::unit::Unit::same_dimension(Self, Self) -> bool
+impl core::fmt::Display for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::unit::Unit
+pub type radroots_core::unit::Unit::Err = radroots_core::unit::ParseError
+pub fn radroots_core::unit::Unit::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::unit::Unit
+pub fn radroots_core::unit::Unit::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::Currency(_)
+impl radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::AUD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::CAD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::EUR: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::GBP: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::JPY: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::USD: radroots_core::currency::Currency
+pub const fn radroots_core::currency::Currency::as_bytes(&self) -> &[u8; 3]
+pub fn radroots_core::currency::Currency::as_str(&self) -> &str
+pub const fn radroots_core::currency::Currency::from_const([u8; 3]) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub fn radroots_core::currency::Currency::from_str_upper(&str) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub const fn radroots_core::currency::Currency::minor_unit_exponent(&self) -> u32
+impl core::convert::TryFrom<&str> for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Error = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::try_from(&str) -> core::result::Result<Self, Self::Error>
+impl core::fmt::Debug for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::fmt::Display for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Err = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::Decimal(pub rust_decimal::decimal::Decimal)
+impl radroots_core::decimal::Decimal
+pub const radroots_core::decimal::Decimal::MAX: Self
+pub const radroots_core::decimal::Decimal::MAX_SCALE: u32
+pub const radroots_core::decimal::Decimal::MIN: Self
+pub const radroots_core::decimal::Decimal::ONE: Self
+pub const radroots_core::decimal::Decimal::ZERO: Self
+pub fn radroots_core::decimal::Decimal::checked_add(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_div(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_mul(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_sub(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_f64_display(f64) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_str_exact(&str) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::is_sign_negative(&self) -> bool
+pub fn radroots_core::decimal::Decimal::is_zero(&self) -> bool
+pub fn radroots_core::decimal::Decimal::normalize(&self) -> rust_decimal::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::rescale(&mut self, u32)
+pub fn radroots_core::decimal::Decimal::scale(&self) -> u32
+pub fn radroots_core::decimal::Decimal::to_f64_lossy(&self) -> core::option::Option<f64>
+pub fn radroots_core::decimal::Decimal::to_u64_exact(&self) -> core::option::Option<u64>
+pub fn radroots_core::decimal::Decimal::try_rescale_exact(&mut self, u32) -> core::result::Result<(), radroots_core::decimal::Error>
+impl core::convert::From<i32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i32) -> Self
+impl core::convert::From<i64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i64) -> Self
+impl core::convert::From<radroots_core::decimal::Decimal> for rust_decimal::decimal::Decimal
+pub fn rust_decimal::decimal::Decimal::from(radroots_core::decimal::Decimal) -> Self
+impl core::convert::From<rust_decimal::decimal::Decimal> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(rust_decimal::decimal::Decimal) -> Self
+impl core::convert::From<u32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u32) -> Self
+impl core::convert::From<u64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u64) -> Self
+impl core::fmt::Display for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Add for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::add(self, Self) -> Self
+impl core::ops::arith::Div for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::div(self, Self) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::mul(self, Self) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Sub for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::sub(self, Self) -> Self
+impl core::str::traits::FromStr for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Err = radroots_core::decimal::Error
+pub fn radroots_core::decimal::Decimal::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::Money
+pub radroots_core::Money::amount: radroots_core::decimal::Decimal
+pub radroots_core::Money::currency: radroots_core::currency::Currency
+impl radroots_core::money::Money
+pub const fn radroots_core::money::Money::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::money::Money::checked_add(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_sub(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub const fn radroots_core::money::Money::currency(&self) -> radroots_core::currency::Currency
+pub fn radroots_core::money::Money::div_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::money::Error>
+pub fn radroots_core::money::Money::from_minor_units_u32(u32, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::from_minor_units_u64(u64, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::is_zero(&self) -> bool
+pub fn radroots_core::money::Money::mul_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency(self) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency_with_strategy(self, rust_decimal::decimal::RoundingStrategy) -> Self
+pub fn radroots_core::money::Money::to_minor_units_u32_exact(&self) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u32_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_exact(&self) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_with_scale_exact(self, u32) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::with_scale(self, u32) -> Self
+pub fn radroots_core::money::Money::zero(radroots_core::currency::Currency) -> Self
+impl core::fmt::Display for radroots_core::money::Money
+pub fn radroots_core::money::Money::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+pub struct radroots_core::Percent
+pub radroots_core::Percent::value: radroots_core::decimal::Decimal
+impl radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::from_ratio(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::new(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::of_money(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::of_money_quantized(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::to_ratio(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::percent::Percent::try_from_ratio(radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::percent::Percent::try_of_money(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_of_money_quantized(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_to_ratio(&self) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::decimal::Error>
+impl core::fmt::Display for radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::percent::Percent
+pub type radroots_core::percent::Percent::Err = radroots_core::percent::ParseError
+pub fn radroots_core::percent::Percent::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub struct radroots_core::Quantity
+pub radroots_core::Quantity::amount: radroots_core::decimal::Decimal
+pub radroots_core::Quantity::label: core::option::Option<alloc::string::String>
+pub radroots_core::Quantity::unit: radroots_core::unit::Unit
+impl radroots_core::quantity::Quantity
+pub const fn radroots_core::quantity::Quantity::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::quantity::Quantity::canonical_unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::checked_add(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_sub(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::clear_label(self) -> Self
+pub fn radroots_core::quantity::Quantity::div_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::is_canonical(&self) -> bool
+pub fn radroots_core::quantity::Quantity::is_zero(&self) -> bool
+pub fn radroots_core::quantity::Quantity::label(&self) -> core::option::Option<&str>
+pub fn radroots_core::quantity::Quantity::mul_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> Self
+pub fn radroots_core::quantity::Quantity::to_canonical(&self) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_add(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_convert_to(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<Self, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_sub(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub const fn radroots_core::quantity::Quantity::unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::with_label<S: core::convert::Into<alloc::string::String>>(self, S) -> Self
+pub fn radroots_core::quantity::Quantity::with_optional_label<S: core::convert::Into<alloc::string::String>>(self, core::option::Option<S>) -> Self
+pub fn radroots_core::quantity::Quantity::with_scale(self, u32) -> Self
+pub fn radroots_core::quantity::Quantity::zero(radroots_core::unit::Unit) -> Self
+impl core::fmt::Display for radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub struct radroots_core::QuantityPrice
+pub radroots_core::QuantityPrice::amount: radroots_core::money::Money
+pub radroots_core::QuantityPrice::quantity: radroots_core::quantity::Quantity
+impl radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::amount(&self) -> &radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::is_price_per_canonical_unit(&self) -> bool
+pub fn radroots_core::QuantityPrice::new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> Self
+pub fn radroots_core::QuantityPrice::quantity(&self) -> &radroots_core::quantity::Quantity
+pub fn radroots_core::QuantityPrice::try_cost_for_amount_in(&self, radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_quantity_in(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> core::result::Result<Self, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_canonical_unit_price(&self) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_unit_price(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::validate(&self) -> core::result::Result<(), radroots_core::RadrootsCoreQuantityPriceError>
+impl radroots_core::RadrootsCoreQuantityPriceOps for radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub struct radroots_core::RadrootsCoreCurrency(_)
+impl radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::AUD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::CAD: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::EUR: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::GBP: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::JPY: radroots_core::currency::Currency
+pub const radroots_core::currency::Currency::USD: radroots_core::currency::Currency
+pub const fn radroots_core::currency::Currency::as_bytes(&self) -> &[u8; 3]
+pub fn radroots_core::currency::Currency::as_str(&self) -> &str
+pub const fn radroots_core::currency::Currency::from_const([u8; 3]) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub fn radroots_core::currency::Currency::from_str_upper(&str) -> core::result::Result<Self, radroots_core::currency::ParseError>
+pub const fn radroots_core::currency::Currency::minor_unit_exponent(&self) -> u32
+impl core::convert::TryFrom<&str> for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Error = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::try_from(&str) -> core::result::Result<Self, Self::Error>
+impl core::fmt::Debug for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::fmt::Display for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::currency::Currency
+pub type radroots_core::currency::Currency::Err = radroots_core::currency::ParseError
+pub fn radroots_core::currency::Currency::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::currency::Currency
+pub fn radroots_core::currency::Currency::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::RadrootsCoreDecimal(pub rust_decimal::decimal::Decimal)
+impl radroots_core::decimal::Decimal
+pub const radroots_core::decimal::Decimal::MAX: Self
+pub const radroots_core::decimal::Decimal::MAX_SCALE: u32
+pub const radroots_core::decimal::Decimal::MIN: Self
+pub const radroots_core::decimal::Decimal::ONE: Self
+pub const radroots_core::decimal::Decimal::ZERO: Self
+pub fn radroots_core::decimal::Decimal::checked_add(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_div(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_mul(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::checked_sub(self, Self) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_f64_display(f64) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::from_str_exact(&str) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::decimal::Decimal::is_sign_negative(&self) -> bool
+pub fn radroots_core::decimal::Decimal::is_zero(&self) -> bool
+pub fn radroots_core::decimal::Decimal::normalize(&self) -> rust_decimal::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::rescale(&mut self, u32)
+pub fn radroots_core::decimal::Decimal::scale(&self) -> u32
+pub fn radroots_core::decimal::Decimal::to_f64_lossy(&self) -> core::option::Option<f64>
+pub fn radroots_core::decimal::Decimal::to_u64_exact(&self) -> core::option::Option<u64>
+pub fn radroots_core::decimal::Decimal::try_rescale_exact(&mut self, u32) -> core::result::Result<(), radroots_core::decimal::Error>
+impl core::convert::From<i32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i32) -> Self
+impl core::convert::From<i64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(i64) -> Self
+impl core::convert::From<radroots_core::decimal::Decimal> for rust_decimal::decimal::Decimal
+pub fn rust_decimal::decimal::Decimal::from(radroots_core::decimal::Decimal) -> Self
+impl core::convert::From<rust_decimal::decimal::Decimal> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(rust_decimal::decimal::Decimal) -> Self
+impl core::convert::From<u32> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u32) -> Self
+impl core::convert::From<u64> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::from(u64) -> Self
+impl core::fmt::Display for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Add for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::add(self, Self) -> Self
+impl core::ops::arith::Div for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::div(self, Self) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::mul(self, Self) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Sub for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Output = radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::sub(self, Self) -> Self
+impl core::str::traits::FromStr for radroots_core::decimal::Decimal
+pub type radroots_core::decimal::Decimal::Err = radroots_core::decimal::Error
+pub fn radroots_core::decimal::Decimal::from_str(&str) -> core::result::Result<Self, Self::Err>
+impl serde_core::ser::Serialize for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::serialize<S: serde_core::ser::Serializer>(&self, S) -> core::result::Result<<S as serde_core::ser::Serializer>::Ok, <S as serde_core::ser::Serializer>::Error>
+impl<'de> serde_core::de::Deserialize<'de> for radroots_core::decimal::Decimal
+pub fn radroots_core::decimal::Decimal::deserialize<D: serde_core::de::Deserializer<'de>>(D) -> core::result::Result<Self, <D as serde_core::de::Deserializer>::Error>
+pub struct radroots_core::RadrootsCoreDiscount
+pub radroots_core::RadrootsCoreDiscount::scope: radroots_core::RadrootsCoreDiscountScope
+pub radroots_core::RadrootsCoreDiscount::threshold: radroots_core::RadrootsCoreDiscountThreshold
+pub radroots_core::RadrootsCoreDiscount::value: radroots_core::RadrootsCoreDiscountValue
+impl radroots_core::RadrootsCoreDiscount
+pub fn radroots_core::RadrootsCoreDiscount::is_non_negative(&self) -> bool
+pub fn radroots_core::RadrootsCoreDiscount::scope(&self) -> &radroots_core::RadrootsCoreDiscountScope
+pub fn radroots_core::RadrootsCoreDiscount::threshold(&self) -> &radroots_core::RadrootsCoreDiscountThreshold
+pub fn radroots_core::RadrootsCoreDiscount::try_new(radroots_core::RadrootsCoreDiscountScope, radroots_core::RadrootsCoreDiscountThreshold, radroots_core::RadrootsCoreDiscountValue) -> core::result::Result<Self, radroots_core::pricing::DiscountError>
+pub fn radroots_core::RadrootsCoreDiscount::validate(&self) -> core::result::Result<(), radroots_core::pricing::DiscountError>
+pub fn radroots_core::RadrootsCoreDiscount::value(&self) -> &radroots_core::RadrootsCoreDiscountValue
+pub struct radroots_core::RadrootsCoreMoney
+pub radroots_core::RadrootsCoreMoney::amount: radroots_core::decimal::Decimal
+pub radroots_core::RadrootsCoreMoney::currency: radroots_core::currency::Currency
+impl radroots_core::money::Money
+pub const fn radroots_core::money::Money::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::money::Money::checked_add(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::checked_sub(&self, &Self) -> core::result::Result<Self, radroots_core::money::Error>
+pub const fn radroots_core::money::Money::currency(&self) -> radroots_core::currency::Currency
+pub fn radroots_core::money::Money::div_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::money::Error>
+pub fn radroots_core::money::Money::from_minor_units_u32(u32, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::from_minor_units_u64(u64, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::is_zero(&self) -> bool
+pub fn radroots_core::money::Money::mul_decimal(&self, radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::money::Money::new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency(self) -> Self
+pub fn radroots_core::money::Money::quantize_to_currency_with_strategy(self, rust_decimal::decimal::RoundingStrategy) -> Self
+pub fn radroots_core::money::Money::to_minor_units_u32_exact(&self) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u32_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u32, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_exact(&self) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::to_minor_units_u64_rounded(&self, rust_decimal::decimal::RoundingStrategy) -> core::result::Result<u64, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_new(radroots_core::decimal::Decimal, radroots_core::currency::Currency) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::try_with_scale_exact(self, u32) -> core::result::Result<Self, radroots_core::money::Error>
+pub fn radroots_core::money::Money::with_scale(self, u32) -> Self
+pub fn radroots_core::money::Money::zero(radroots_core::currency::Currency) -> Self
+impl core::fmt::Display for radroots_core::money::Money
+pub fn radroots_core::money::Money::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::div(self, radroots_core::decimal::Decimal) -> Self
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::money::Money
+pub type radroots_core::money::Money::Output = radroots_core::money::Money
+pub fn radroots_core::money::Money::mul(self, radroots_core::decimal::Decimal) -> Self
+pub struct radroots_core::RadrootsCorePercent
+pub radroots_core::RadrootsCorePercent::value: radroots_core::decimal::Decimal
+impl radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::from_ratio(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::new(radroots_core::decimal::Decimal) -> Self
+pub fn radroots_core::percent::Percent::of_money(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::of_money_quantized(&self, &radroots_core::money::Money) -> radroots_core::money::Money
+pub fn radroots_core::percent::Percent::to_ratio(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::percent::Percent::try_from_ratio(radroots_core::decimal::Decimal) -> core::result::Result<Self, radroots_core::decimal::Error>
+pub fn radroots_core::percent::Percent::try_of_money(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_of_money_quantized(&self, &radroots_core::money::Money) -> core::result::Result<radroots_core::money::Money, radroots_core::money::Error>
+pub fn radroots_core::percent::Percent::try_to_ratio(&self) -> core::result::Result<radroots_core::decimal::Decimal, radroots_core::decimal::Error>
+impl core::fmt::Display for radroots_core::percent::Percent
+pub fn radroots_core::percent::Percent::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::str::traits::FromStr for radroots_core::percent::Percent
+pub type radroots_core::percent::Percent::Err = radroots_core::percent::ParseError
+pub fn radroots_core::percent::Percent::from_str(&str) -> core::result::Result<Self, Self::Err>
+pub struct radroots_core::RadrootsCoreQuantity
+pub radroots_core::RadrootsCoreQuantity::amount: radroots_core::decimal::Decimal
+pub radroots_core::RadrootsCoreQuantity::label: core::option::Option<alloc::string::String>
+pub radroots_core::RadrootsCoreQuantity::unit: radroots_core::unit::Unit
+impl radroots_core::quantity::Quantity
+pub const fn radroots_core::quantity::Quantity::amount(&self) -> radroots_core::decimal::Decimal
+pub fn radroots_core::quantity::Quantity::canonical_unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::checked_add(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::checked_div_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_mul_decimal(&self, radroots_core::decimal::Decimal) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::checked_sub(&self, &radroots_core::quantity::Quantity) -> core::option::Option<radroots_core::quantity::Quantity>
+pub fn radroots_core::quantity::Quantity::clear_label(self) -> Self
+pub fn radroots_core::quantity::Quantity::div_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::ensure_non_negative(&self) -> core::result::Result<(), radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::is_canonical(&self) -> bool
+pub fn radroots_core::quantity::Quantity::is_zero(&self) -> bool
+pub fn radroots_core::quantity::Quantity::label(&self) -> core::option::Option<&str>
+pub fn radroots_core::quantity::Quantity::mul_decimal(&self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> Self
+pub fn radroots_core::quantity::Quantity::to_canonical(&self) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_add(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_convert_to(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::unit::ConvertError>
+pub fn radroots_core::quantity::Quantity::try_new(radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<Self, radroots_core::quantity::Error>
+pub fn radroots_core::quantity::Quantity::try_sub(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::quantity::Quantity, radroots_core::quantity::Error>
+pub const fn radroots_core::quantity::Quantity::unit(&self) -> radroots_core::unit::Unit
+pub fn radroots_core::quantity::Quantity::with_label<S: core::convert::Into<alloc::string::String>>(self, S) -> Self
+pub fn radroots_core::quantity::Quantity::with_optional_label<S: core::convert::Into<alloc::string::String>>(self, core::option::Option<S>) -> Self
+pub fn radroots_core::quantity::Quantity::with_scale(self, u32) -> Self
+pub fn radroots_core::quantity::Quantity::zero(radroots_core::unit::Unit) -> Self
+impl core::fmt::Display for radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result
+impl core::ops::arith::Div<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::div(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+impl core::ops::arith::Mul<radroots_core::decimal::Decimal> for radroots_core::quantity::Quantity
+pub type radroots_core::quantity::Quantity::Output = radroots_core::quantity::Quantity
+pub fn radroots_core::quantity::Quantity::mul(self, radroots_core::decimal::Decimal) -> radroots_core::quantity::Quantity
+pub struct radroots_core::RadrootsCoreQuantityPrice
+pub radroots_core::RadrootsCoreQuantityPrice::amount: radroots_core::money::Money
+pub radroots_core::RadrootsCoreQuantityPrice::quantity: radroots_core::quantity::Quantity
+impl radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::amount(&self) -> &radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::is_price_per_canonical_unit(&self) -> bool
+pub fn radroots_core::QuantityPrice::new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> Self
+pub fn radroots_core::QuantityPrice::quantity(&self) -> &radroots_core::quantity::Quantity
+pub fn radroots_core::QuantityPrice::try_cost_for_amount_in(&self, radroots_core::decimal::Decimal, radroots_core::unit::Unit) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_quantity_in(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_new(radroots_core::money::Money, radroots_core::quantity::Quantity) -> core::result::Result<Self, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_canonical_unit_price(&self) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_to_unit_price(&self, radroots_core::unit::Unit) -> core::result::Result<radroots_core::QuantityPrice, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::validate(&self) -> core::result::Result<(), radroots_core::RadrootsCoreQuantityPriceError>
+impl radroots_core::RadrootsCoreQuantityPriceOps for radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub trait radroots_core::RadrootsCoreQuantityPriceOps: radroots_core::quantity_price::sealed::Sealed
+pub fn radroots_core::RadrootsCoreQuantityPriceOps::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::RadrootsCoreQuantityPriceOps::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::RadrootsCoreQuantityPriceOps::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::RadrootsCoreQuantityPriceOps::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::RadrootsCoreQuantityPriceOps::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+impl radroots_core::RadrootsCoreQuantityPriceOps for radroots_core::QuantityPrice
+pub fn radroots_core::QuantityPrice::cost_for(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::cost_for_with_quantized_price(&self, &radroots_core::quantity::Quantity) -> radroots_core::money::Money
+pub fn radroots_core::QuantityPrice::try_cost_for(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>
+pub fn radroots_core::QuantityPrice::try_cost_for_rounded(&self, &radroots_core::quantity::Quantity) -> core::result::Result<radroots_core::money::Money, radroots_core::RadrootsCoreQuantityPriceError>