Expand description
Domain-Driven Design building blocks for Rust: entities, value objects,
aggregates, repositories, and event dispatch, plus derive macros for the
common cases. A single-dependency facade re-exporting
ddd-toolkit-core and, behind the
derive feature (on by default),
ddd-toolkit-macro. See this
crate’s README for a full example.
§Example
use ddd_toolkit::domain::{SecretVo, ValidationError, Wrapped};
#[derive(ddd_toolkit::ValueObject, Clone, PartialEq, Debug)]
#[vo(validate = "validate_email")]
struct Email(String);
fn validate_email(s: &str) -> Result<(), ValidationError> {
if s.contains('@') {
Ok(())
} else {
Err(ValidationError::new("Email", "missing @"))
}
}
#[derive(ddd_toolkit::SecretVo, Clone, PartialEq)]
struct ApiKey(String);
let email = Email::try_from("a@b.com".to_string()).unwrap();
assert_eq!(email.as_inner(), "a@b.com");
let key = ApiKey::try_new("sekret".to_string()).unwrap();
assert_eq!(format!("{key:?}"), "ApiKey(***)"); // never leaks the secretModules§
- adapter
- Real (non-test-double) implementations of the
crate::porttraits. - application
- The application layer: orchestrating domain objects and ports to carry out a single use case.
- domain
- The domain layer: entities, value objects, aggregates, and events.
- mock
- Test doubles for the
crate::porttraits: fixed/in-memory implementations useful in tests, or as a starting point for a real adapter. - port
- The ports a domain depends on: repository, event dispatch, clock, and id generation.
Derive Macros§
- Entity
Id - Derives
EntityId(and everything#[derive(ValueObject)]derives) for a single-field tuple struct. - EnumVo
- Derives
EnumVofor a fieldless enum. - Secret
Vo - Derives
SecretVofor a single-field tuple struct, with aDebugimpl that always redacts the wrapped value. - Value
Object - Derives
ValueObjectandWrappedfor a single-field tuple struct. See the crate-level docs for supported#[vo(...)]attributes.