atagen

jelq

public

an http based roguelike rpg about jelqing

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

Blame: src/game/lube.rs

8b8e83329a1datagen2026-10-12 12:01 UTC1
use axum::http::StatusCode;
8b8e83329a1datagen2026-10-12 12:01 UTC2
use serde_json::json;
8b8e83329a1datagen2026-10-12 12:01 UTC3
8b8e83329a1datagen2026-10-12 12:01 UTC4
use super::Item;
8b8e83329a1datagen2026-10-12 12:01 UTC5
use crate::problem::Problem;
8b8e83329a1datagen2026-10-12 12:01 UTC6
8b8e83329a1datagen2026-10-12 12:01 UTC7
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
8b8e83329a1datagen2026-10-12 12:01 UTC8
pub enum Lube {
8b8e83329a1datagen2026-10-12 12:01 UTC9
    BabyOil,
8b8e83329a1datagen2026-10-12 12:01 UTC10
    CoconutOil,
8b8e83329a1datagen2026-10-12 12:01 UTC11
    Lotion,
8b8e83329a1datagen2026-10-12 12:01 UTC12
    Vaseline,
8b8e83329a1datagen2026-10-12 12:01 UTC13
    Spit,
8b8e83329a1datagen2026-10-12 12:01 UTC14
}
8b8e83329a1datagen2026-10-12 12:01 UTC15
8b8e83329a1datagen2026-10-12 12:01 UTC16
impl Lube {
4f54028cba69atagen2026-10-14 11:45 UTC17
    const ALL: [Self; 5] = [
4f54028cba69atagen2026-10-14 11:45 UTC18
        Self::BabyOil,
4f54028cba69atagen2026-10-14 11:45 UTC19
        Self::CoconutOil,
4f54028cba69atagen2026-10-14 11:45 UTC20
        Self::Lotion,
4f54028cba69atagen2026-10-14 11:45 UTC21
        Self::Vaseline,
4f54028cba69atagen2026-10-14 11:45 UTC22
        Self::Spit,
4f54028cba69atagen2026-10-14 11:45 UTC23
    ];
4f54028cba69atagen2026-10-14 11:45 UTC24
4f54028cba69atagen2026-10-14 11:45 UTC25
    pub fn content_types() -> [&'static str; 5] {
4f54028cba69atagen2026-10-14 11:45 UTC26
        Self::ALL.map(Self::content_type)
4f54028cba69atagen2026-10-14 11:45 UTC27
    }
4f54028cba69atagen2026-10-14 11:45 UTC28
4f54028cba69atagen2026-10-14 11:45 UTC29
    fn content_type(self) -> &'static str {
4f54028cba69atagen2026-10-14 11:45 UTC30
        match self {
4f54028cba69atagen2026-10-14 11:45 UTC31
            Self::BabyOil => "application/baby-oil",
4f54028cba69atagen2026-10-14 11:45 UTC32
            Self::CoconutOil => "application/coconut-oil",
4f54028cba69atagen2026-10-14 11:45 UTC33
            Self::Lotion => "application/lotion",
4f54028cba69atagen2026-10-14 11:45 UTC34
            Self::Vaseline => "application/vaseline",
4f54028cba69atagen2026-10-14 11:45 UTC35
            Self::Spit => "text/plain; charset=spit",
4f54028cba69atagen2026-10-14 11:45 UTC36
        }
4f54028cba69atagen2026-10-14 11:45 UTC37
    }
4f54028cba69atagen2026-10-14 11:45 UTC38
8b8e83329a1datagen2026-10-12 12:01 UTC39
    pub fn from_content_type(content_type: Option<&str>) -> Result<Option<Self>, Problem> {
8b8e83329a1datagen2026-10-12 12:01 UTC40
        let Some(raw) = content_type else {
8b8e83329a1datagen2026-10-12 12:01 UTC41
            return Ok(None);
8b8e83329a1datagen2026-10-12 12:01 UTC42
        };
8b8e83329a1datagen2026-10-12 12:01 UTC43
        let lowered = raw.to_ascii_lowercase();
8b8e83329a1datagen2026-10-12 12:01 UTC44
        let mut parts = lowered.split(';').map(str::trim);
8b8e83329a1datagen2026-10-12 12:01 UTC45
        let essence = parts.next().unwrap_or_default();
8b8e83329a1datagen2026-10-12 12:01 UTC46
        let spit = parts.any(|p| p.replace(' ', "") == "charset=spit");
4f54028cba69atagen2026-10-14 11:45 UTC47
        if let Some(lube) = Self::ALL.into_iter().find(|l| l.content_type() == essence) {
4f54028cba69atagen2026-10-14 11:45 UTC48
            return Ok(Some(lube));
4f54028cba69atagen2026-10-14 11:45 UTC49
        }
8b8e83329a1datagen2026-10-12 12:01 UTC50
        match essence {
8b8e83329a1datagen2026-10-12 12:01 UTC51
            "text/plain" if spit => Ok(Some(Self::Spit)),
8b8e83329a1datagen2026-10-12 12:01 UTC52
            e if e.starts_with("image/") || e.starts_with("video/") => Err(Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC53
                StatusCode::UNSUPPORTED_MEDIA_TYPE,
8b8e83329a1datagen2026-10-12 12:01 UTC54
                "no",
8b8e83329a1datagen2026-10-12 12:01 UTC55
                "No.",
8b8e83329a1datagen2026-10-12 12:01 UTC56
            )),
8b8e83329a1datagen2026-10-12 12:01 UTC57
            _ => Err(Problem::new(
8b8e83329a1datagen2026-10-12 12:01 UTC58
                StatusCode::UNSUPPORTED_MEDIA_TYPE,
8b8e83329a1datagen2026-10-12 12:01 UTC59
                "unsupported-lubricant",
8b8e83329a1datagen2026-10-12 12:01 UTC60
                format!("{essence} is not a lubricant."),
8b8e83329a1datagen2026-10-12 12:01 UTC61
            )
4f54028cba69atagen2026-10-14 11:45 UTC62
            .with("lubricants", json!(Self::content_types()))),
8b8e83329a1datagen2026-10-12 12:01 UTC63
        }
8b8e83329a1datagen2026-10-12 12:01 UTC64
    }
8b8e83329a1datagen2026-10-12 12:01 UTC65
8b8e83329a1datagen2026-10-12 12:01 UTC66
    pub fn modifier(self) -> i32 {
8b8e83329a1datagen2026-10-12 12:01 UTC67
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC68
            Self::BabyOil => 1,
8b8e83329a1datagen2026-10-12 12:01 UTC69
            Self::CoconutOil => 3,
8b8e83329a1datagen2026-10-12 12:01 UTC70
            Self::Lotion => 0,
8b8e83329a1datagen2026-10-12 12:01 UTC71
            Self::Vaseline => 2,
8b8e83329a1datagen2026-10-12 12:01 UTC72
            Self::Spit => -2,
8b8e83329a1datagen2026-10-12 12:01 UTC73
        }
8b8e83329a1datagen2026-10-12 12:01 UTC74
    }
8b8e83329a1datagen2026-10-12 12:01 UTC75
8b8e83329a1datagen2026-10-12 12:01 UTC76
    /// The bottle this lube comes in. Spit has none and never runs out.
8b8e83329a1datagen2026-10-12 12:01 UTC77
    pub fn item(self) -> Option<Item> {
8b8e83329a1datagen2026-10-12 12:01 UTC78
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC79
            Self::Spit => None,
8b8e83329a1datagen2026-10-12 12:01 UTC80
            Self::BabyOil => Some(Item::BabyOil),
8b8e83329a1datagen2026-10-12 12:01 UTC81
            Self::CoconutOil => Some(Item::CoconutOil),
8b8e83329a1datagen2026-10-12 12:01 UTC82
            Self::Lotion => Some(Item::Lotion),
8b8e83329a1datagen2026-10-12 12:01 UTC83
            Self::Vaseline => Some(Item::Vaseline),
8b8e83329a1datagen2026-10-12 12:01 UTC84
        }
8b8e83329a1datagen2026-10-12 12:01 UTC85
    }
8b8e83329a1datagen2026-10-12 12:01 UTC86
}
8b8e83329a1datagen2026-10-12 12:01 UTC87
8b8e83329a1datagen2026-10-12 12:01 UTC88
#[derive(Clone, Copy)]
8b8e83329a1datagen2026-10-12 12:01 UTC89
pub enum LubeRule {
8b8e83329a1datagen2026-10-12 12:01 UTC90
    Required,
8b8e83329a1datagen2026-10-12 12:01 UTC91
    Forbidden,
8b8e83329a1datagen2026-10-12 12:01 UTC92
    Optional,
8b8e83329a1datagen2026-10-12 12:01 UTC93
}
8b8e83329a1datagen2026-10-12 12:01 UTC94
8b8e83329a1datagen2026-10-12 12:01 UTC95
impl LubeRule {
8b8e83329a1datagen2026-10-12 12:01 UTC96
    pub(super) fn name(self) -> &'static str {
8b8e83329a1datagen2026-10-12 12:01 UTC97
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC98
            Self::Required => "required",
8b8e83329a1datagen2026-10-12 12:01 UTC99
            Self::Forbidden => "forbidden",
8b8e83329a1datagen2026-10-12 12:01 UTC100
            Self::Optional => "optional",
8b8e83329a1datagen2026-10-12 12:01 UTC101
        }
8b8e83329a1datagen2026-10-12 12:01 UTC102
    }
8b8e83329a1datagen2026-10-12 12:01 UTC103
}