use {
crate::{
DatastarEvent,
prelude::{ExecuteScript, PatchElements, PatchSignals},
},
rocket::response::stream::Event,
std::fmt::Write,
};
impl PatchElements {
pub fn write_as_rocket_sse_event(&self) -> Event {
self.as_datastar_event().write_as_rocket_sse_event()
}
}
impl From<PatchElements> for Event {
fn from(value: PatchElements) -> Self {
value.write_as_rocket_sse_event()
}
}
impl From<&PatchElements> for Event {
fn from(value: &PatchElements) -> Self {
value.write_as_rocket_sse_event()
}
}
impl PatchSignals {
pub fn write_as_rocket_sse_event(&self) -> Event {
self.as_datastar_event().write_as_rocket_sse_event()
}
}
impl From<PatchSignals> for Event {
fn from(value: PatchSignals) -> Self {
value.write_as_rocket_sse_event()
}
}
impl From<&PatchSignals> for Event {
fn from(value: &PatchSignals) -> Self {
value.write_as_rocket_sse_event()
}
}
impl ExecuteScript {
pub fn write_as_rocket_sse_event(&self) -> Event {
self.as_datastar_event().write_as_rocket_sse_event()
}
}
impl From<ExecuteScript> for Event {
fn from(value: ExecuteScript) -> Self {
value.write_as_rocket_sse_event()
}
}
impl From<&ExecuteScript> for Event {
fn from(value: &ExecuteScript) -> Self {
value.write_as_rocket_sse_event()
}
}
impl DatastarEvent {
pub fn write_as_rocket_sse_event(&self) -> Event {
let mut data = String::with_capacity(
self.data.iter().map(|s| s.len()).sum::<usize>() + self.data.len() - 1,
);
let mut sep = "";
for line in self.data.iter() {
let _ = write!(&mut data, "{sep}{line}");
sep = "\n";
}
let event = Event::data(data)
.event(self.event.as_str().to_owned())
.with_retry(self.retry);
match self.id.as_deref() {
Some(id) => event.id(id.to_owned()),
None => event,
}
}
}
impl From<DatastarEvent> for Event {
fn from(value: DatastarEvent) -> Self {
value.write_as_rocket_sse_event()
}
}
impl From<&DatastarEvent> for Event {
fn from(value: &DatastarEvent) -> Self {
value.write_as_rocket_sse_event()
}
}