use serde::de::DeserializeOwned;
use super::SseJsonMode;
use crate::{HttpError, HttpResult};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SseEvent {
pub event: Option<String>,
pub data: String,
pub id: Option<String>,
pub retry: Option<u64>,
}
impl SseEvent {
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 event data as JSON (event={:?}, id={:?}): {}",
self.event, self.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 event JSON in lenient mode (event={:?}, id={:?}): {}",
self.event,
self.id,
error
);
Ok(None)
}
},
}
}
}