atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
6619c458c23edaf053ae371f8aa0df1e866febb6
1
ssh://brewery@pls.lobotomise.me:33/atagen/jelq.git

Blame: src/http/parse.rs

8b8e83329a1datagen2026-10-12 12:01 UTC1
use axum::http::StatusCode;
8b8e83329a1datagen2026-10-12 12:01 UTC2
8b8e83329a1datagen2026-10-12 12:01 UTC3
use super::ctx::Ctx;
8b8e83329a1datagen2026-10-12 12:01 UTC4
use crate::{
8b8e83329a1datagen2026-10-12 12:01 UTC5
    game::{Run, Technique},
8b8e83329a1datagen2026-10-12 12:01 UTC6
    problem::Problem,
8b8e83329a1datagen2026-10-12 12:01 UTC7
};
8b8e83329a1datagen2026-10-12 12:01 UTC8
8b8e83329a1datagen2026-10-12 12:01 UTC9
pub(super) fn parse_techniques(run: &Run, ctx: &Ctx) -> Result<Vec<Technique>, Problem> {
8b8e83329a1datagen2026-10-12 12:01 UTC10
    let required = || {
8b8e83329a1datagen2026-10-12 12:01 UTC11
        Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC12
            StatusCode::BAD_REQUEST,
8b8e83329a1datagen2026-10-12 12:01 UTC13
            "technique-required",
8b8e83329a1datagen2026-10-12 12:01 UTC14
            "No technique was specified.",
8b8e83329a1datagen2026-10-12 12:01 UTC15
        )
8b8e83329a1datagen2026-10-12 12:01 UTC16
        .with("techniques", run.path("/techniques"))
8b8e83329a1datagen2026-10-12 12:01 UTC17
    };
8b8e83329a1datagen2026-10-12 12:01 UTC18
    let names = ctx
8b8e83329a1datagen2026-10-12 12:01 UTC19
        .query("technique")
8b8e83329a1datagen2026-10-12 12:01 UTC20
        .filter(|n| !n.trim().is_empty())
8b8e83329a1datagen2026-10-12 12:01 UTC21
        .ok_or_else(required)?;
8b8e83329a1datagen2026-10-12 12:01 UTC22
    names
8b8e83329a1datagen2026-10-12 12:01 UTC23
        .split(',')
8b8e83329a1datagen2026-10-12 12:01 UTC24
        .map(str::trim)
8b8e83329a1datagen2026-10-12 12:01 UTC25
        .filter(|n| !n.is_empty())
8b8e83329a1datagen2026-10-12 12:01 UTC26
        .map(|name| {
8b8e83329a1datagen2026-10-12 12:01 UTC27
            Technique::parse(name).ok_or_else(|| {
8b8e83329a1datagen2026-10-12 12:01 UTC28
                Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC29
                    StatusCode::BAD_REQUEST,
8b8e83329a1datagen2026-10-12 12:01 UTC30
                    "unknown-technique",
8b8e83329a1datagen2026-10-12 12:01 UTC31
                    format!("{name} is not a technique."),
8b8e83329a1datagen2026-10-12 12:01 UTC32
                )
8b8e83329a1datagen2026-10-12 12:01 UTC33
                .with("techniques", run.path("/techniques"))
8b8e83329a1datagen2026-10-12 12:01 UTC34
            })
8b8e83329a1datagen2026-10-12 12:01 UTC35
        })
8b8e83329a1datagen2026-10-12 12:01 UTC36
        .collect()
8b8e83329a1datagen2026-10-12 12:01 UTC37
}
8b8e83329a1datagen2026-10-12 12:01 UTC38
8b8e83329a1datagen2026-10-12 12:01 UTC39
pub(super) fn parse_intensity(ctx: &Ctx) -> Result<i32, Problem> {
8b8e83329a1datagen2026-10-12 12:01 UTC40
    match ctx.query("intensity").map(str::parse::<i32>) {
8b8e83329a1datagen2026-10-12 12:01 UTC41
        None => Ok(5),
8b8e83329a1datagen2026-10-12 12:01 UTC42
        Some(Ok(i)) if (1..=10).contains(&i) => Ok(i),
8b8e83329a1datagen2026-10-12 12:01 UTC43
        Some(_) => Err(Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC44
            StatusCode::BAD_REQUEST,
8b8e83329a1datagen2026-10-12 12:01 UTC45
            "intensity-out-of-range",
8b8e83329a1datagen2026-10-12 12:01 UTC46
            "Intensity is measured from 1 to 10.",
8b8e83329a1datagen2026-10-12 12:01 UTC47
        )),
8b8e83329a1datagen2026-10-12 12:01 UTC48
    }
8b8e83329a1datagen2026-10-12 12:01 UTC49
}