svalaskevicius / eventflow

cqrs+es in scala
45 stars 4 forks source link

Better DSL for defining aggregate #15

Closed svalaskevicius closed 8 years ago

svalaskevicius commented 8 years ago

Shorter, more succinct syntax

Fristi commented 8 years ago

Something like this:

val closedState = handler {
  pass[Open, Opened] switchTo(openState) orElse
  pass[Lock, Locked] switchTo(ev => lockedState(ev.key))
}

def lockedState(key: String) = handler {
  guard[Unlock, Unlocked]
   .rule(cmd => cmd.key.nonEmpty, "Key is not allowed to be empty!")
   .rule(cmd => cmd.key == key, "Key is invalid") switchTo(closedState)
}

val openState = handler {
  pass[Close, Closed] switchTo(closedState)
}