Quick Start
Create a .ddd File
Create registration.ddd:
context Registration {
type UserId = String type Email = String type DisplayName = String type Reason = String
command Register { userId: UserId email: Email name: DisplayName validate email != "" else "Email must not be empty" validate name != "" else "Display name must not be empty" }
command Deactivate { userId: UserId reason: Reason }
event Registered { userId: UserId email: Email name: DisplayName }
event Deactivated { userId: UserId reason: Reason }
decider User { commands: Register, Deactivate events: Registered, Deactivated state: Unregistered | Active(email: Email, name: DisplayName) | Inactive(reason: Reason) initial: Unregistered terminal: Inactive
decide(Register, Unregistered) -> [Registered { userId, email, name }]
decide(Deactivate, Unregistered) -> impossible "Cannot deactivate an unregistered user"
decide(Register, Active) -> already "User is already registered"
decide(Deactivate, Active) -> [Deactivated { userId, reason }]
evolve(Unregistered, Registered) -> Active evolve(Unregistered, Deactivated) -> Inactive evolve(Active, Registered) -> Active evolve(Active, Deactivated) -> Inactive
}}What This Describes
- A context named
Registration(a bounded context) - A command
Registercarrying user data - An event
Registeredrecording what happened - A decider
Userwith two states:UnregisteredandActive
The decider accepts Register only when Unregistered, produces a Registered event, and transitions to Active.
Validate
weltenwanderer validate registration.dddOutput on success:
✓ registration.dddThe validate command accepts one or more glob patterns and reports errors with line:col positions.
Generate Code
weltenwanderer generate registration.ddd --target emmettThe generate command uses the Emmett code generator to produce TypeScript output. See Code Generation for details on the generated file structure.