Current section
Files
Jump to
Current section
Files
src/parse.gleam
import snag.{Result}
import gleam
import gleam/int
import gleam/list
import gleam/result
import gleam/string
pub type Day =
Int
pub fn int(s: String) -> Result(Int) {
s
|> int.parse
|> replace_error(
["failed to parse \"", s, "\" as int"]
|> string.concat(),
)
}
pub fn day(s: String) -> Result(Day) {
try i = int(s)
case i > 0 && i < 26 {
True -> Ok(i)
False ->
["invalid day value ", "'", s, "'"]
|> string.concat
|> snag.error
|> snag.context("day must be an integer from 1 to 25")
}
}
pub fn days(l: List(String)) -> Result(List(Day)) {
case l {
[] -> snag.error("no days selected")
_ ->
l
|> list.try_map(day)
|> snag.context("could not map day values to integers")
}
}
pub fn replace_error(r: gleam.Result(a, b), s: String) -> Result(a) {
result.replace_error(r, snag.new(s))
}