runic 1.1.0

Stupid string to duration converter
Documentation
// Input
// ...

Input = _{ SOI ~ Expr* ~ EOI }

WordExpr = _{
  ASCII_ALPHA+
}

Expr = _{
  WHITE_SPACE*
  ~ (AtTimeExpr | WordExpr | DurationExpr)
  ~ WHITE_SPACE*
}

// Duration
// ...

Hours = {
  "hour" ~ "s"?
  | "hr" ~ "s"?
  | "h"
}

Minutes = {
  "minute" ~ "s"?
  | "min" ~ "s"?
  | "m"
}

Seconds = {
  "second" ~ "s"?
  | "sec" ~ "s"?
  | "s"
}

Duration = {
  "-"?
  ~ ASCII_DIGIT*
  ~ ("." ~ ASCII_DIGIT*)?
}

DurationExpr = {
  Duration
  ~ WHITE_SPACE*
  ~ (Hours | Minutes | Seconds)
}

// At Time
// ...

AtHours = {
  ASCII_DIGIT+
}

AtMinutes = {
  ASCII_DIGIT+
}

TimeValue = _{
  AtHours
  ~ ":"?
  ~ AtMinutes?
}

Pm = { "PM" | "pm" }
Am = { "AM" | "am" }

AtTime = {
  TimeValue
  ~ (WHITE_SPACE* ~ (Am | Pm))?
}

AtTimeExpr = {
  "at"
  ~ WHITE_SPACE+
  ~ AtTime
  ~ (WHITE_SPACE+ ~ TimezoneLikeExpr)?
}

// Timezone
// ...

TimezonePositive = { "+" }
TimezoneNegative = { "-" }
TimezoneSign = _{ TimezonePositive | TimezoneNegative }
TimezoneUTCLiteral = _{ ^"utc" }

TimezoneHours = { ASCII_DIGIT{1,2} }
TimezoneHours2 = { ASCII_DIGIT{2} }
TimezoneMinutes = { ASCII_DIGIT{2} }
TimezoneLiteral = _{
  (!"0" ~ TimezoneHours ~ !":")
  | (TimezoneHours2 ~ ":"? ~ TimezoneMinutes)
}

TimezoneLikeExpr = {
  TimezoneUTCLiteral
  ~ (ASCII_DIGIT | "+" | "-" | ":")*
}

TimezoneExpr = {
  TimezoneUTCLiteral
  ~ (TimezoneSign ~ TimezoneLiteral)?
}