atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
4f54028cba69da7f639027da5dd3ef6190edb2cc
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> {
4f54028cba69atagen2026-10-14 11:45 UTC10
    let listed = |problem: Problem| problem.with("techniques", run.path("/techniques"));
8b8e83329a1datagen2026-10-12 12:01 UTC11
    let required = || {
4f54028cba69atagen2026-10-14 11:45 UTC12
        listed(Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC13
            StatusCode::BAD_REQUEST,
8b8e83329a1datagen2026-10-12 12:01 UTC14
            "technique-required",
8b8e83329a1datagen2026-10-12 12:01 UTC15
            "No technique was specified.",
4f54028cba69atagen2026-10-14 11:45 UTC16
        ))
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(|| {
4f54028cba69atagen2026-10-14 11:45 UTC28
                listed(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."),
4f54028cba69atagen2026-10-14 11:45 UTC32
                ))
8b8e83329a1datagen2026-10-12 12:01 UTC33
            })
8b8e83329a1datagen2026-10-12 12:01 UTC34
        })
8b8e83329a1datagen2026-10-12 12:01 UTC35
        .collect()
8b8e83329a1datagen2026-10-12 12:01 UTC36
}
8b8e83329a1datagen2026-10-12 12:01 UTC37
8b8e83329a1datagen2026-10-12 12:01 UTC38
pub(super) fn parse_intensity(ctx: &Ctx) -> Result<i32, Problem> {
8b8e83329a1datagen2026-10-12 12:01 UTC39
    match ctx.query("intensity").map(str::parse::<i32>) {
8b8e83329a1datagen2026-10-12 12:01 UTC40
        None => Ok(5),
8b8e83329a1datagen2026-10-12 12:01 UTC41
        Some(Ok(i)) if (1..=10).contains(&i) => Ok(i),
8b8e83329a1datagen2026-10-12 12:01 UTC42
        Some(_) => Err(Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC43
            StatusCode::BAD_REQUEST,
8b8e83329a1datagen2026-10-12 12:01 UTC44
            "intensity-out-of-range",
8b8e83329a1datagen2026-10-12 12:01 UTC45
            "Intensity is measured from 1 to 10.",
8b8e83329a1datagen2026-10-12 12:01 UTC46
        )),
8b8e83329a1datagen2026-10-12 12:01 UTC47
    }
8b8e83329a1datagen2026-10-12 12:01 UTC48
}