Defines and schedules Garmin workouts
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

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")
}
}