use std::fmt::{self, Display, Formatter};
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(docsrs, doc(cfg(feature = "sse")))]
pub enum Event {
Message {
id: String,
event: String,
data: String,
},
Retry {
retry: u64,
},
}
impl Display for Event {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Event::Message { id, event, data } => {
if !id.is_empty() {
writeln!(f, "id: {}", &id)?;
}
if !event.is_empty() && event != "message" {
writeln!(f, "event: {}", &event)?;
}
for line in data.lines() {
writeln!(f, "data: {line}")?;
}
writeln!(f)?;
Ok(())
}
Event::Retry { retry } => {
writeln!(f, "retry: {retry}")?;
writeln!(f)
}
}
}
}
impl Event {
#[must_use]
pub fn message(data: impl Into<String>) -> Self {
Event::Message {
id: String::new(),
event: String::new(),
data: data.into(),
}
}
#[must_use]
pub fn id(mut self, id: impl Into<String>) -> Self {
if let Event::Message { id: msg_id, .. } = &mut self {
*msg_id = id.into();
}
self
}
#[must_use]
pub fn event_type(mut self, event: impl Into<String>) -> Self {
if let Event::Message {
event: msg_event, ..
} = &mut self
{
*msg_event = event.into();
}
self
}
#[must_use]
pub fn retry(time: u64) -> Self {
Event::Retry { retry: time }
}
}