All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eventstore.EventStream.scala Maven / Gradle / Ivy

The newest version!
package eventstore

sealed trait EventStream {
  def isSystem: Boolean
  def isMetadata: Boolean
}

object EventStream {

  def apply(id: String): EventStream = id match {
    case null | "" => All
    case _         => Id(id)
  }

  def apply(x: UserCredentials): EventStream = Id(x)

  case object All extends EventStream {

    def isSystem = true
    def isMetadata = false

    override def toString = "Stream.All"
  }

  sealed trait Id extends EventStream {
    lazy val streamId: String = prefix + value

    def value: String
    def prefix: String
    def metadata: Metadata
  }

  object Id {
    def apply(x: UserCredentials): Id = System(x)

    def apply(streamId: String): Id = {
      require(streamId != null, "streamId must not be null")
      require(streamId.nonEmpty, "streamId must not be empty")
      if (streamId startsWith "$$") Metadata(streamId substring 2) else HasMetadata(streamId)
    }
  }

  sealed trait HasMetadata extends Id {
    lazy val metadata: Metadata = Metadata(streamId)
  }

  object HasMetadata {
    def apply(streamId: String): HasMetadata = {
      require(streamId != null, "streamId must not be null")
      require(streamId.nonEmpty, "streamId must not be empty")
      require(!(streamId startsWith "$$"), s"streamId must not start with $$$$, but is $streamId")
      if (streamId startsWith "$") System(streamId substring 1) else Plain(streamId)
    }
  }

  case class Plain(value: String) extends HasMetadata {
    require(value != null, "value must not be null")
    require(value.nonEmpty, "value must not be empty")
    require(!(value startsWith "$"), s"value must not start with $$, but is $value")

    def prefix = ""
    def isSystem = false
    def isMetadata = false

    override lazy val toString = s"Stream($streamId)"
  }

  case class System(value: String) extends HasMetadata {
    require(value != null, "value must not be null")
    require(value.nonEmpty, "value must not be empty")
    require(!(value startsWith "$"), s"value must not start with $$, but is $value")

    def prefix = "$"
    def isSystem = true
    def isMetadata = false

    override lazy val toString = s"SystemStream($streamId)"
  }

  object System {
    def apply(x: UserCredentials): System = System(s"user-${x.login}")
  }

  case class Metadata(value: String) extends Id {
    require(value != null, "value must not be null")
    require(value.nonEmpty, "value must not be empty")
    require(!(value startsWith "$$"), s"value must not start with $$$$, but is $value")

    def prefix = "$$"
    def isSystem = false
    def isMetadata = true
    def metadata = this

    lazy val original: HasMetadata = HasMetadata(value)

    override lazy val toString = s"MetadataStream($streamId)"
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy