use core::hash;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Never(core::convert::Infallible);
impl hash::Hash for Never {
#[inline]
fn hash<H: hash::Hasher>(&self, _: &mut H) {
self.consume()
}
}
impl Never {
pub fn consume(self) -> ! {
match self.0 {}
}
}
#[cfg(feature = "serde")]
mod serde {
use core::fmt;
use serde::{
ser::{Serialize, Serializer},
de::{Deserialize, Deserializer, Visitor},
};
use super::Never;
struct NeverVisitor;
impl<'de> Visitor<'de> for NeverVisitor {
type Value = Never;
#[inline]
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("uninhabitable")
}
}
impl<'de> Deserialize<'de> for Never {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>
{
deserializer.deserialize_str(NeverVisitor)
}
}
impl Serialize for Never {
#[inline]
fn serialize<S: Serializer>(&self, _: S) -> Result<S::Ok, S::Error> {
self.consume()
}
}
}