use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, strum::EnumDiscriminants)]
#[strum_discriminants(derive(strum::EnumIter))]
pub enum FetchResponse<T, Id> {
Fetched(T),
NotFound(Id),
NotProvided(Id),
}
impl<T, Id> FetchResponse<T, Id> {
pub(crate) fn from_opt(id: Id, item: Option<T>) -> Self {
match item {
Some(item) => FetchResponse::Fetched(item),
None => FetchResponse::NotFound(id),
}
}
pub(crate) fn was_found(&self) -> bool {
matches!(self, FetchResponse::Fetched(_))
}
}
impl<T, Id> FetchResponse<T, Id>
where
Self: Serialize,
{
pub(crate) fn to_serialized(&self) -> Result<Vec<u8>, bincode::Error> {
bincode::serialize(self)
}
}
mod specimen_support {
use crate::utils::specimen::{largest_variant, Cache, LargestSpecimen, SizeEstimator};
use serde::Serialize;
use super::{FetchResponse, FetchResponseDiscriminants};
impl<T: Serialize + LargestSpecimen, Id: Serialize + LargestSpecimen> LargestSpecimen
for FetchResponse<T, Id>
{
fn largest_specimen<E: SizeEstimator>(estimator: &E, cache: &mut Cache) -> Self {
largest_variant::<Self, FetchResponseDiscriminants, _, _>(estimator, |variant| {
match variant {
FetchResponseDiscriminants::Fetched => {
FetchResponse::Fetched(LargestSpecimen::largest_specimen(estimator, cache))
}
FetchResponseDiscriminants::NotFound => {
FetchResponse::NotFound(LargestSpecimen::largest_specimen(estimator, cache))
}
FetchResponseDiscriminants::NotProvided => FetchResponse::NotProvided(
LargestSpecimen::largest_specimen(estimator, cache),
),
}
})
}
}
}