use std::ops::{Deref, DerefMut};
use std::str::FromStr;
use derive_more::{Display, IsVariant};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Copy, Clone, Debug, Display, IsVariant)]
pub enum Value<T> {
Default(T),
Explicit(T),
}
impl<T> Value<T> {
pub fn into_inner(self) -> T {
match self {
Self::Default(x) => x,
Self::Explicit(x) => x,
}
}
}
impl<T> AsRef<T> for Value<T> {
fn as_ref(&self) -> &T {
match self {
Value::Default(x) => x,
Value::Explicit(x) => x,
}
}
}
impl<T> AsMut<T> for Value<T> {
fn as_mut(&mut self) -> &mut T {
match self {
Value::Default(x) => x,
Value::Explicit(x) => x,
}
}
}
impl<T> Deref for Value<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
AsRef::as_ref(self)
}
}
impl<T> DerefMut for Value<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
AsMut::as_mut(self)
}
}
impl<T> PartialEq for Value<T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
AsRef::as_ref(self) == AsRef::as_ref(other)
}
}
impl<T> PartialEq<T> for Value<T>
where
T: PartialEq,
{
fn eq(&self, other: &T) -> bool {
AsRef::as_ref(self) == other
}
}
impl<T> FromStr for Value<T>
where
T: FromStr,
{
type Err = T::Err;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self::Explicit(T::from_str(s)?))
}
}
impl<T> Serialize for Value<T>
where
T: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
T::serialize(self, serializer)
}
}
impl<'de, T> Deserialize<'de> for Value<T>
where
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(Self::Explicit(T::deserialize(deserializer)?))
}
}