atagen

jelq

public

an http based roguelike rpg about jelqing

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

Blame: src/link.rs

4f54028cba69atagen2026-10-14 11:45 UTC1
use std::fmt;
4f54028cba69atagen2026-10-14 11:45 UTC2
4f54028cba69atagen2026-10-14 11:45 UTC3
pub const REL_BASE: &str = "https://jelq.dev/rels/";
4f54028cba69atagen2026-10-14 11:45 UTC4
4f54028cba69atagen2026-10-14 11:45 UTC5
enum Rel<'a> {
4f54028cba69atagen2026-10-14 11:45 UTC6
    Jelq(&'a str),
4f54028cba69atagen2026-10-14 11:45 UTC7
    Registered(&'a str),
4f54028cba69atagen2026-10-14 11:45 UTC8
}
4f54028cba69atagen2026-10-14 11:45 UTC9
4f54028cba69atagen2026-10-14 11:45 UTC10
/// One RFC 8288 link. `allow`, `lubricant` and `intensity` are extension attributes (§3), so a client never
4f54028cba69atagen2026-10-14 11:45 UTC11
/// has to guess what a target accepts.
4f54028cba69atagen2026-10-14 11:45 UTC12
pub struct Link<'a> {
4f54028cba69atagen2026-10-14 11:45 UTC13
    href: &'a str,
4f54028cba69atagen2026-10-14 11:45 UTC14
    rel: Rel<'a>,
4f54028cba69atagen2026-10-14 11:45 UTC15
    title: Option<&'a str>,
4f54028cba69atagen2026-10-14 11:45 UTC16
    allow: Option<&'a str>,
4f54028cba69atagen2026-10-14 11:45 UTC17
    lubricant: Option<&'a str>,
4f54028cba69atagen2026-10-14 11:45 UTC18
    intensity: Option<&'a str>,
4f54028cba69atagen2026-10-14 11:45 UTC19
}
4f54028cba69atagen2026-10-14 11:45 UTC20
4f54028cba69atagen2026-10-14 11:45 UTC21
impl<'a> Link<'a> {
4f54028cba69atagen2026-10-14 11:45 UTC22
    fn new(href: &'a str, rel: Rel<'a>) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC23
        Self {
4f54028cba69atagen2026-10-14 11:45 UTC24
            href,
4f54028cba69atagen2026-10-14 11:45 UTC25
            rel,
4f54028cba69atagen2026-10-14 11:45 UTC26
            title: None,
4f54028cba69atagen2026-10-14 11:45 UTC27
            allow: None,
4f54028cba69atagen2026-10-14 11:45 UTC28
            lubricant: None,
4f54028cba69atagen2026-10-14 11:45 UTC29
            intensity: None,
4f54028cba69atagen2026-10-14 11:45 UTC30
        }
4f54028cba69atagen2026-10-14 11:45 UTC31
    }
4f54028cba69atagen2026-10-14 11:45 UTC32
4f54028cba69atagen2026-10-14 11:45 UTC33
    /// A relation of this game's own, named under `REL_BASE`.
4f54028cba69atagen2026-10-14 11:45 UTC34
    pub fn jelq(href: &'a str, rel: &'a str) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC35
        Self::new(href, Rel::Jelq(rel))
4f54028cba69atagen2026-10-14 11:45 UTC36
    }
4f54028cba69atagen2026-10-14 11:45 UTC37
4f54028cba69atagen2026-10-14 11:45 UTC38
    /// A relation from the IANA registry, such as `next` or `alternate`.
4f54028cba69atagen2026-10-14 11:45 UTC39
    pub fn registered(href: &'a str, rel: &'a str) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC40
        Self::new(href, Rel::Registered(rel))
4f54028cba69atagen2026-10-14 11:45 UTC41
    }
4f54028cba69atagen2026-10-14 11:45 UTC42
4f54028cba69atagen2026-10-14 11:45 UTC43
    pub fn title(self, title: &'a str) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC44
        Self {
4f54028cba69atagen2026-10-14 11:45 UTC45
            title: Some(title),
4f54028cba69atagen2026-10-14 11:45 UTC46
            ..self
4f54028cba69atagen2026-10-14 11:45 UTC47
        }
4f54028cba69atagen2026-10-14 11:45 UTC48
    }
4f54028cba69atagen2026-10-14 11:45 UTC49
4f54028cba69atagen2026-10-14 11:45 UTC50
    pub fn allow(self, allow: &'a str) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC51
        Self {
4f54028cba69atagen2026-10-14 11:45 UTC52
            allow: Some(allow),
4f54028cba69atagen2026-10-14 11:45 UTC53
            ..self
4f54028cba69atagen2026-10-14 11:45 UTC54
        }
4f54028cba69atagen2026-10-14 11:45 UTC55
    }
4f54028cba69atagen2026-10-14 11:45 UTC56
4f54028cba69atagen2026-10-14 11:45 UTC57
    pub fn lubricant(self, lubricant: Option<&'a str>) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC58
        Self { lubricant, ..self }
4f54028cba69atagen2026-10-14 11:45 UTC59
    }
4f54028cba69atagen2026-10-14 11:45 UTC60
4f54028cba69atagen2026-10-14 11:45 UTC61
    pub fn intensity(self, intensity: Option<&'a str>) -> Self {
4f54028cba69atagen2026-10-14 11:45 UTC62
        Self { intensity, ..self }
4f54028cba69atagen2026-10-14 11:45 UTC63
    }
4f54028cba69atagen2026-10-14 11:45 UTC64
}
4f54028cba69atagen2026-10-14 11:45 UTC65
4f54028cba69atagen2026-10-14 11:45 UTC66
impl fmt::Display for Link<'_> {
4f54028cba69atagen2026-10-14 11:45 UTC67
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4f54028cba69atagen2026-10-14 11:45 UTC68
        write!(f, "<{}>; rel=\"", self.href)?;
4f54028cba69atagen2026-10-14 11:45 UTC69
        match self.rel {
4f54028cba69atagen2026-10-14 11:45 UTC70
            Rel::Jelq(rel) => write!(f, "{REL_BASE}{rel}\"")?,
4f54028cba69atagen2026-10-14 11:45 UTC71
            Rel::Registered(rel) => write!(f, "{rel}\"")?,
4f54028cba69atagen2026-10-14 11:45 UTC72
        }
4f54028cba69atagen2026-10-14 11:45 UTC73
        for (name, value) in [
4f54028cba69atagen2026-10-14 11:45 UTC74
            ("title", self.title),
4f54028cba69atagen2026-10-14 11:45 UTC75
            ("allow", self.allow),
4f54028cba69atagen2026-10-14 11:45 UTC76
            ("lubricant", self.lubricant),
4f54028cba69atagen2026-10-14 11:45 UTC77
            ("intensity", self.intensity),
4f54028cba69atagen2026-10-14 11:45 UTC78
        ] {
4f54028cba69atagen2026-10-14 11:45 UTC79
            if let Some(value) = value {
4f54028cba69atagen2026-10-14 11:45 UTC80
                write!(f, "; {name}=\"{value}\"")?;
4f54028cba69atagen2026-10-14 11:45 UTC81
            }
4f54028cba69atagen2026-10-14 11:45 UTC82
        }
4f54028cba69atagen2026-10-14 11:45 UTC83
        Ok(())
4f54028cba69atagen2026-10-14 11:45 UTC84
    }
4f54028cba69atagen2026-10-14 11:45 UTC85
}
4f54028cba69atagen2026-10-14 11:45 UTC86
4f54028cba69atagen2026-10-14 11:45 UTC87
/// A `Link` header value listing every link in order.
4f54028cba69atagen2026-10-14 11:45 UTC88
pub fn join<'a>(links: impl IntoIterator<Item = Link<'a>>) -> String {
4f54028cba69atagen2026-10-14 11:45 UTC89
    links
4f54028cba69atagen2026-10-14 11:45 UTC90
        .into_iter()
4f54028cba69atagen2026-10-14 11:45 UTC91
        .map(|link| link.to_string())
4f54028cba69atagen2026-10-14 11:45 UTC92
        .collect::<Vec<_>>()
4f54028cba69atagen2026-10-14 11:45 UTC93
        .join(", ")
4f54028cba69atagen2026-10-14 11:45 UTC94
}