use parking_lot::{ReentrantMutex, ReentrantMutexGuard};
use serde::{Serialize, Deserialize, ser::Serializer, de::{Visitor, Deserializer, Error}};
#[derive(Debug, Default)]
pub enum Unthreader {
#[default]
No,
Yes(ReentrantMutex<()>)
}
impl Unthreader {
pub fn no() -> Self {
Self::No
}
pub fn yes() -> Self {
Self::Yes(Default::default())
}
pub fn r#if(x: bool) -> Self {
match x {
false => Self::no(),
true => Self::yes()
}
}
#[must_use]
pub fn unthread(&self) -> Option<ReentrantMutexGuard<'_, ()>> {
match self {
Self::No => None,
Self::Yes(x) => Some(x.lock())
}
}
}
struct UnthreaderVisitor;
impl<'de> Visitor<'de> for UnthreaderVisitor {
type Value = Unthreader;
fn visit_bool<E: Error>(self, v: bool) -> Result<Self::Value, E> {
Ok(Unthreader::r#if(v))
}
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(formatter, "Expected a bool")
}
}
impl<'de> Deserialize<'de> for Unthreader {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
deserializer.deserialize_any(UnthreaderVisitor)
}
}
impl Serialize for Unthreader {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_bool(match self {
Self::No => false,
Self::Yes(_) => true
})
}
}