atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
4f54028cba69da7f639027da5dd3ef6190edb2cc
1
ssh://brewery@pls.lobotomise.me:33/atagen/jelq.git
src/http/parse.rsRust48 lines1.4 KB
1
use axum::http::StatusCode;
2
3
use super::ctx::Ctx;
4
use crate::{
5
    game::{Run, Technique},
6
    problem::Problem,
7
};
8
9
pub(super) fn parse_techniques(run: &Run, ctx: &Ctx) -> Result<Vec<Technique>, Problem> {
10
    let listed = |problem: Problem| problem.with("techniques", run.path("/techniques"));
11
    let required = || {
12
        listed(Problem::new(
13
            StatusCode::BAD_REQUEST,
14
            "technique-required",
15
            "No technique was specified.",
16
        ))
17
    };
18
    let names = ctx
19
        .query("technique")
20
        .filter(|n| !n.trim().is_empty())
21
        .ok_or_else(required)?;
22
    names
23
        .split(',')
24
        .map(str::trim)
25
        .filter(|n| !n.is_empty())
26
        .map(|name| {
27
            Technique::parse(name).ok_or_else(|| {
28
                listed(Problem::new(
29
                    StatusCode::BAD_REQUEST,
30
                    "unknown-technique",
31
                    format!("{name} is not a technique."),
32
                ))
33
            })
34
        })
35
        .collect()
36
}
37
38
pub(super) fn parse_intensity(ctx: &Ctx) -> Result<i32, Problem> {
39
    match ctx.query("intensity").map(str::parse::<i32>) {
40
        None => Ok(5),
41
        Some(Ok(i)) if (1..=10).contains(&i) => Ok(i),
42
        Some(_) => Err(Problem::new(
43
            StatusCode::BAD_REQUEST,
44
            "intensity-out-of-range",
45
            "Intensity is measured from 1 to 10.",
46
        )),
47
    }
48
}