atagen

jelq

public

an http based roguelike rpg about jelqing

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