use serde::de::DeserializeOwned;
use super::SseJsonMode;
use crate::{
HttpError,
HttpResult,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SseMessage {
pub event: Option<String>,
pub data: String,
pub last_event_id: Option<String>,
}
impl SseMessage {
pub fn decode_json<T>(&self) -> HttpResult<T>
where
T: DeserializeOwned,
{
serde_json::from_str::<T>(&self.data).map_err(|error| {
HttpError::sse_decode(format!(
"Failed to decode SSE message data as JSON (event={:?}, last_event_id={:?}): {}",
self.event, self.last_event_id, error
))
})
}
pub fn decode_json_with_mode<T>(&self, mode: SseJsonMode) -> HttpResult<Option<T>>
where
T: DeserializeOwned,
{
match mode {
SseJsonMode::Strict => self.decode_json::<T>().map(Some),
SseJsonMode::Lenient => match serde_json::from_str::<T>(&self.data) {
Ok(value) => Ok(Some(value)),
Err(error) => {
tracing::debug!(
"Skipping malformed SSE message JSON in lenient mode (event={:?}, last_event_id={:?}): {}",
self.event,
self.last_event_id,
error
);
Ok(None)
}
},
}
}
}