summaryrefslogtreecommitdiff
path: root/src/channel/header.rs
blob: eda82140dcf98e7fb9f1d18dc2c3956ed67f36f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use axum::http::{HeaderName, HeaderValue};

pub struct LastEventId(pub String);

static LAST_EVENT_ID: HeaderName = HeaderName::from_static("last-event-id");

impl headers::Header for LastEventId {
    fn name() -> &'static HeaderName {
        &LAST_EVENT_ID
    }

    fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
    where
        I: Iterator<Item = &'i HeaderValue>,
    {
        let value = values.next().ok_or_else(headers::Error::invalid)?;
        if let Ok(value) = value.to_str() {
            Ok(Self(value.into()))
        } else {
            Err(headers::Error::invalid())
        }
    }

    fn encode<E>(&self, values: &mut E)
    where
        E: Extend<HeaderValue>,
    {
        let Self(value) = self;
        // Must panic or suppress; the trait provides no other options.
        let value = HeaderValue::from_str(value).expect("LastEventId is a valid header value");

        values.extend(std::iter::once(value));
    }
}