use serde::{Deserialize, Serialize, de::Visitor};
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
pub enum BackpressureStrategy {
RetryUntilDelivered,
DiscardData,
}
impl Serialize for BackpressureStrategy {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&alloc::format!("{self:?}"))
}
}
struct BackpressureStrategyVisitor;
impl Visitor<'_> for BackpressureStrategyVisitor {
type Value = BackpressureStrategy;
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
formatter.write_str("a string containing either 'RetryUntilDelivered' or 'DiscardData'")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match v {
"DiscardData" => Ok(BackpressureStrategy::DiscardData),
"RetryUntilDelivered" => Ok(BackpressureStrategy::RetryUntilDelivered),
v => Err(E::custom(alloc::format!(
"Invalid BackpressureStrategy provided: \"{v:?}\"."
))),
}
}
}
impl<'de> Deserialize<'de> for BackpressureStrategy {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
deserializer.deserialize_str(BackpressureStrategyVisitor)
}
}