tfhe_versionable/
deprecation.rsuse std::error::Error;
use std::fmt::Display;
use std::marker::PhantomData;
use serde::{Deserialize, Serialize};
use crate::{UnversionizeError, Upgrade, Version};
pub trait Deprecable {
const TYPE_NAME: &'static str;
const MIN_SUPPORTED_APP_VERSION: &'static str;
fn error() -> DeprecatedVersionError {
DeprecatedVersionError {
type_name: Self::TYPE_NAME.to_string(),
min_supported_app_version: Self::MIN_SUPPORTED_APP_VERSION.to_string(),
}
}
}
#[derive(Debug)]
pub struct DeprecatedVersionError {
type_name: String,
min_supported_app_version: String,
}
impl Display for DeprecatedVersionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Deprecated {} found in serialized data, minimal supported version is {}",
self.type_name, self.min_supported_app_version
)
}
}
impl Error for DeprecatedVersionError {}
pub struct Deprecated<T> {
_phantom: PhantomData<T>,
}
pub struct DeprecatedVersion<T> {
_phantom: PhantomData<T>,
}
impl<T: Deprecable> Serialize for DeprecatedVersion<T> {
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
Err(serde::ser::Error::custom(
"a DeprecatedVersion should never be serialized",
))
}
}
impl<'de, T: Deprecable> Deserialize<'de> for DeprecatedVersion<T> {
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Err(<D::Error as serde::de::Error>::custom(T::error()))
}
}
impl<T: Deprecable> Version for Deprecated<T> {
type Ref<'vers>
= DeprecatedVersion<T>
where
T: 'vers;
type Owned = DeprecatedVersion<T>;
}
impl<T: Deprecable> From<Deprecated<T>> for DeprecatedVersion<T> {
fn from(_value: Deprecated<T>) -> Self {
Self {
_phantom: PhantomData,
}
}
}
impl<T: Deprecable> From<&Deprecated<T>> for DeprecatedVersion<T> {
fn from(_value: &Deprecated<T>) -> Self {
Self {
_phantom: PhantomData,
}
}
}
impl<T: Deprecable> TryFrom<DeprecatedVersion<T>> for Deprecated<T> {
type Error = UnversionizeError;
fn try_from(_value: DeprecatedVersion<T>) -> Result<Self, Self::Error> {
Err(UnversionizeError::DeprecatedVersion(T::error()))
}
}
impl<T: Deprecable, U> Upgrade<U> for Deprecated<T> {
type Error = DeprecatedVersionError;
fn upgrade(self) -> Result<U, Self::Error> {
Err(T::error())
}
}