datastar 0.3.1

Datastar SDK for Rust
Documentation
//! Rocket integration for Datastar.

use {
    crate::{
        DatastarEvent,
        prelude::{ExecuteScript, PatchElements, PatchSignals},
    },
    rocket::response::stream::Event,
    std::fmt::Write,
};

impl PatchElements {
    /// Write this [`PatchElements`] into a Rocket SSE [`Event`].
    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 {
    /// Write this [`PatchSignals`] into a Rocket SSE [`Event`].
    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 {
    /// Write this [`ExecuteScript`] into a Rocket SSE [`Event`].
    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 {
    /// Turn this [`DatastarEvent`] into a Rocket SSE [`Event`].
    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() {
            // Assumption: std::fmt::write does not fail ever for [`String`].
            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()
    }
}