I'd like to ask a stylistic question. I have a decoder that decodes [1, "s"] into 1 second, [2, "ns"] into 2 nanosecond, and fails to decode if the array is the wrong length or if the unit string is not recognised. I currently interpret the unit string with a pattern match on DecodeResult. Is this the most stylistically optimal way to express this behaviour in a decoder? Code below.
import argonaut.Argonaut._
import scala.concurrent.duration._
import scalaz.{-\/, \/, \/-}
implicit def argoDecodeDuration: DecodeJson[FiniteDuration] = {
number <- (c =\ 0).as[Long]
case DecodeResult(\/-(unit)) =>
case "d" => DecodeResult.ok(number days)
case "h" => DecodeResult.ok(number hours)
case "m" => DecodeResult.ok(number minutes)
case "s" => DecodeResult.ok(number seconds)
case "ms" => DecodeResult.ok(number milliseconds)
case "us" => DecodeResult.ok(number microseconds)
case "ns" => DecodeResult.ok(number nanoseconds)
case _ => DecodeResult.fail(s"Invalid duration unit '$unit'", cc.history)
case failure => DecodeResult.fail(s"Expected duration unit", cc.history)
}.validate({ c => (c =\ 2).failed }, "Too many elements for duration")
object DurationCodec extends DurationCodec