Marek M.
Marek M.

Reputation: 3951

Exhaustive match on possible object values

First the code:

object MyEnums {
  sealed abstract class MyEnum(val value: String)

  case object First extends MyEnum("Some_ugly_looking_value1")
  case object Second extends MyEnum("Some_ugly_looking_value2")
  case object Third extends MyEnum("Some_ugly_looking_value3")
  case object Fourth extends MyEnum("Some_ugly_looking_value4")

  def fromString(value: String): Option[MyEnum] =
    value match {
      case First.value => Option(First)
      case Second.value => Option(Second)
      case Third.value => Option(Third)
      case Fourth.value => Option(Fourth)
      case _ => None
    }
}

What I'm trying to achieve here is to be able to parse a string value coming from the outside into the form of the above enum. At the same time I would like to have the exhaustive pattern matching compiler warning if I don't cover all options in the match expression. What options do I have here? I don't like what I implemented above, since if this enum grows I may just forget to implement the new case clause...

Upvotes: 2

Views: 186

Answers (1)

Mario Galic
Mario Galic

Reputation: 48410

Consider enumeratum like so

import enumeratum._

sealed abstract class MyEnum(override val entryName: String) extends EnumEntry

object MyEnum extends Enum[MyEnum] {
  val values = findValues

  case object First extends MyEnum("Some_ugly_looking_value1")
  case object Second extends MyEnum("Some_ugly_looking_value2")
  case object Third extends MyEnum("Some_ugly_looking_value3")
  case object Fourth extends MyEnum("Some_ugly_looking_value4")
}


MyEnum.withName("Some_ugly_looking_value1") // res1: MyEnum = First

Now we do not have to fiddle with pattern match when adding a new case object.

Upvotes: 3

Related Questions