You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
27 lines
891 B
27 lines
891 B
package com.github.mgifos.workouts.model
|
|
|
|
import com.github.mgifos.workouts.model.DistanceUnits.DistanceUnit
|
|
|
|
sealed trait Duration
|
|
|
|
case class DistanceDuration(distance: Float, unit: DistanceUnit) extends Duration
|
|
|
|
object DistanceUnits extends Enumeration {
|
|
type DistanceUnit = Value
|
|
val km, mi, m = Value
|
|
}
|
|
|
|
case class TimeDuration(hours: Int = 0, minutes: Int = 0, seconds: Int = 0) extends Duration
|
|
|
|
object Duration {
|
|
|
|
private val DistanceRx = """^(\d+([\.]\d+)?)\s*(km|mi|m)$""".r
|
|
private val MinutesRx = """^(\d{1,3}):(\d{2})$""".r
|
|
|
|
def parse(x: String): Duration = x match {
|
|
case DistanceRx(quantity, _, unit) => DistanceDuration(quantity.toFloat, DistanceUnits.withName(unit))
|
|
case MinutesRx(minutes, seconds) => TimeDuration(minutes = minutes.toInt, seconds = seconds.toInt)
|
|
case _ => throw new IllegalArgumentException(s"Duration cannot be parsed $x")
|
|
}
|
|
}
|
|
|
|
|