controlled vocabularies
There are two major approaches to doing controlled vocabularies in
Scala: using
scala.Enumeration
,
or using a sealed trait with case objects. Here’s a controlled
vocabulary for account status that uses the latter approach:
sealed trait AccountStatus
case object Active extends AccountStatus
case object Suspended extends AccountStatus
case object Cancelled extends AccountStatus
Because longevity supports case objects and polymorphism, this pattern directly translates into a longevity domain model. We are free to use this controlled vocabulary in our domain, such as:
import longevity.model.annotations.persistent
@persistent[DomainModel]
case class Account(
name: String,
accountStatus: AccountStatus)
We just need to annotate the members of our controlled vocabulary with
@polyComponent
and @derivedComponent
:
import longevity.model.annotations.polyComponent
import longevity.model.annotations.derivedComponent
@polyComponent[DomainModel]
sealed trait AccountStatus
@derivedComponent[DomainModel, AccountStatus]
case object Active extends AccountStatus
@derivedComponent[DomainModel, AccountStatus]
case object Suspended extends AccountStatus
@derivedComponent[DomainModel, AccountStatus]
case object Cancelled extends AccountStatus
As with polymorphic components, we must remember to seal the trait to form a proper abstract data type.
Support for scala.Enumeration
would be a great addition, and is on our story
board. If you are interested, this would be a
great user contribution, and we would be happy to support you in implementing it however we can.