use core::fmt;
use std::{mem, str::FromStr};
use crate::{Error, Result};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)]
pub enum DeliveryPolicy {
#[default]
Always,
Latest,
Optional,
Single,
SingleOptional,
}
impl FromStr for DeliveryPolicy {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"always" => Ok(DeliveryPolicy::Always),
"optional" => Ok(DeliveryPolicy::Optional),
"single" => Ok(DeliveryPolicy::Single),
"single-optional" => Ok(DeliveryPolicy::SingleOptional),
_ => Err(Error::InvalidData(s.to_string())),
}
}
}
impl fmt::Display for DeliveryPolicy {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}",
match self {
DeliveryPolicy::Always => "always",
DeliveryPolicy::Latest => "latest",
DeliveryPolicy::Optional => "optional",
DeliveryPolicy::Single => "single",
DeliveryPolicy::SingleOptional => "single-optional",
}
)
}
}
pub trait DataDeliveryPolicy
where
Self: Sized,
{
fn delivery_policy(&self) -> DeliveryPolicy {
DeliveryPolicy::Always
}
fn priority(&self) -> usize {
100
}
fn eq_kind(&self, other: &Self) -> bool {
mem::discriminant(self) == mem::discriminant(other)
}
fn is_expired(&self) -> bool {
false
}
#[doc(hidden)]
fn is_delivery_policy_single(&self) -> bool {
let dp = self.delivery_policy();
dp == DeliveryPolicy::Single || dp == DeliveryPolicy::SingleOptional
}
#[doc(hidden)]
fn is_delivery_policy_optional(&self) -> bool {
let dp = self.delivery_policy();
dp == DeliveryPolicy::Optional || dp == DeliveryPolicy::SingleOptional
}
}
pub enum StorageTryPushOutput<T: Sized> {
Pushed,
Skipped,
Full(T),
}
impl DataDeliveryPolicy for () {}
impl DataDeliveryPolicy for usize {}
impl DataDeliveryPolicy for String {}
impl<T> DataDeliveryPolicy for Vec<T> {}