Skip to content

Quick Start

Create a .ddd File

Create registration.ddd:

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 Register carrying user data
  • An event Registered recording what happened
  • A decider User with two states: Unregistered and Active

The decider accepts Register only when Unregistered, produces a Registered event, and transitions to Active.

Validate

Terminal window
weltenwanderer validate registration.ddd

Output on success:

✓ registration.ddd

The validate command accepts one or more glob patterns and reports errors with line:col positions.

Generate Code

Terminal window
weltenwanderer generate registration.ddd --target emmett

The generate command uses the Emmett code generator to produce TypeScript output. See Code Generation for details on the generated file structure.