atagen

jelq

public

an http based roguelike rpg about jelqing

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

Blame: src/game/outcome.rs

782069860236atagen2026-10-10 12:44 UTC1
use axum::http::{HeaderName, StatusCode};
782069860236atagen2026-10-10 12:44 UTC2
use serde_json::Value;
782069860236atagen2026-10-10 12:44 UTC3
782069860236atagen2026-10-10 12:44 UTC4
pub enum Payload {
782069860236atagen2026-10-10 12:44 UTC5
    Empty,
782069860236atagen2026-10-10 12:44 UTC6
    Json(Value),
782069860236atagen2026-10-10 12:44 UTC7
    Raw(&'static str, Vec<u8>),
782069860236atagen2026-10-10 12:44 UTC8
}
782069860236atagen2026-10-10 12:44 UTC9
782069860236atagen2026-10-10 12:44 UTC10
/// A successful result of a game action, before it becomes an HTTP response.
782069860236atagen2026-10-10 12:44 UTC11
pub struct Outcome {
8b8e83329a1datagen2026-10-12 12:01 UTC12
    status: StatusCode,
8b8e83329a1datagen2026-10-12 12:01 UTC13
    payload: Payload,
8b8e83329a1datagen2026-10-12 12:01 UTC14
    headers: Vec<(HeaderName, String)>,
782069860236atagen2026-10-10 12:44 UTC15
}
782069860236atagen2026-10-10 12:44 UTC16
782069860236atagen2026-10-10 12:44 UTC17
impl Outcome {
782069860236atagen2026-10-10 12:44 UTC18
    pub fn empty(status: StatusCode) -> Self {
782069860236atagen2026-10-10 12:44 UTC19
        Self {
782069860236atagen2026-10-10 12:44 UTC20
            status,
782069860236atagen2026-10-10 12:44 UTC21
            payload: Payload::Empty,
782069860236atagen2026-10-10 12:44 UTC22
            headers: Vec::new(),
782069860236atagen2026-10-10 12:44 UTC23
        }
782069860236atagen2026-10-10 12:44 UTC24
    }
782069860236atagen2026-10-10 12:44 UTC25
782069860236atagen2026-10-10 12:44 UTC26
    pub fn json(status: StatusCode, body: Value) -> Self {
782069860236atagen2026-10-10 12:44 UTC27
        Self {
782069860236atagen2026-10-10 12:44 UTC28
            payload: Payload::Json(body),
782069860236atagen2026-10-10 12:44 UTC29
            ..Self::empty(status)
782069860236atagen2026-10-10 12:44 UTC30
        }
782069860236atagen2026-10-10 12:44 UTC31
    }
782069860236atagen2026-10-10 12:44 UTC32
782069860236atagen2026-10-10 12:44 UTC33
    pub fn raw(status: StatusCode, content_type: &'static str, body: impl Into<Vec<u8>>) -> Self {
782069860236atagen2026-10-10 12:44 UTC34
        Self {
782069860236atagen2026-10-10 12:44 UTC35
            payload: Payload::Raw(content_type, body.into()),
782069860236atagen2026-10-10 12:44 UTC36
            ..Self::empty(status)
782069860236atagen2026-10-10 12:44 UTC37
        }
782069860236atagen2026-10-10 12:44 UTC38
    }
782069860236atagen2026-10-10 12:44 UTC39
782069860236atagen2026-10-10 12:44 UTC40
    pub fn header(mut self, name: HeaderName, value: impl Into<String>) -> Self {
782069860236atagen2026-10-10 12:44 UTC41
        self.headers.push((name, value.into()));
782069860236atagen2026-10-10 12:44 UTC42
        self
782069860236atagen2026-10-10 12:44 UTC43
    }
8b8e83329a1datagen2026-10-12 12:01 UTC44
8b8e83329a1datagen2026-10-12 12:01 UTC45
    pub fn status(&self) -> StatusCode {
8b8e83329a1datagen2026-10-12 12:01 UTC46
        self.status
8b8e83329a1datagen2026-10-12 12:01 UTC47
    }
8b8e83329a1datagen2026-10-12 12:01 UTC48
98432b6057aaatagen2026-10-14 09:03 UTC49
    pub fn body(&self) -> Option<&Value> {
98432b6057aaatagen2026-10-14 09:03 UTC50
        match &self.payload {
98432b6057aaatagen2026-10-14 09:03 UTC51
            Payload::Json(body) => Some(body),
98432b6057aaatagen2026-10-14 09:03 UTC52
            _ => None,
98432b6057aaatagen2026-10-14 09:03 UTC53
        }
98432b6057aaatagen2026-10-14 09:03 UTC54
    }
98432b6057aaatagen2026-10-14 09:03 UTC55
98432b6057aaatagen2026-10-14 09:03 UTC56
    pub fn header_value(&self, name: &HeaderName) -> Option<&str> {
98432b6057aaatagen2026-10-14 09:03 UTC57
        self.headers
98432b6057aaatagen2026-10-14 09:03 UTC58
            .iter()
98432b6057aaatagen2026-10-14 09:03 UTC59
            .find(|(n, _)| n == name)
98432b6057aaatagen2026-10-14 09:03 UTC60
            .map(|(_, v)| v.as_str())
98432b6057aaatagen2026-10-14 09:03 UTC61
    }
98432b6057aaatagen2026-10-14 09:03 UTC62
8b8e83329a1datagen2026-10-12 12:01 UTC63
    pub(super) fn retold(mut self, status: StatusCode, detail: &str) -> Self {
8b8e83329a1datagen2026-10-12 12:01 UTC64
        self.status = status;
8b8e83329a1datagen2026-10-12 12:01 UTC65
        if let Payload::Json(body) = &mut self.payload {
8b8e83329a1datagen2026-10-12 12:01 UTC66
            body["detail"] = Value::from(detail);
8b8e83329a1datagen2026-10-12 12:01 UTC67
        }
8b8e83329a1datagen2026-10-12 12:01 UTC68
        self
8b8e83329a1datagen2026-10-12 12:01 UTC69
    }
8b8e83329a1datagen2026-10-12 12:01 UTC70
8b8e83329a1datagen2026-10-12 12:01 UTC71
    pub fn into_parts(self) -> (StatusCode, Payload, Vec<(HeaderName, String)>) {
8b8e83329a1datagen2026-10-12 12:01 UTC72
        (self.status, self.payload, self.headers)
8b8e83329a1datagen2026-10-12 12:01 UTC73
    }
782069860236atagen2026-10-10 12:44 UTC74
}