use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Asked<T> {
#[default]
NotAsked,
Asked(T),
}
impl<T> Asked<T> {
pub fn is_not_asked(&self) -> bool {
matches!(self, Asked::NotAsked)
}
pub fn is_asked(&self) -> bool {
!self.is_not_asked()
}
pub fn as_option(&self) -> Option<&T> {
match self {
Asked::NotAsked => None,
Asked::Asked(v) => Some(v),
}
}
pub fn into_option(self) -> Option<T> {
match self {
Asked::NotAsked => None,
Asked::Asked(v) => Some(v),
}
}
pub fn as_deref(&self) -> Option<&T::Target>
where
T: std::ops::Deref,
{
self.as_option().map(|v| v.deref())
}
}
impl<T: Copy> Asked<T> {
pub fn get(&self) -> Option<T> {
self.as_option().copied()
}
}
impl<T> From<Option<T>> for Asked<T> {
fn from(o: Option<T>) -> Asked<T> {
match o {
None => Asked::NotAsked,
Some(v) => Asked::Asked(v),
}
}
}
impl<T: Serialize> Serialize for Asked<T> {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
match self {
Asked::NotAsked => s.serialize_none(),
Asked::Asked(v) => v.serialize(s),
}
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Asked<T> {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
T::deserialize(d).map(Asked::Asked)
}
}
pub(crate) fn u64_is_zero(n: &u64) -> bool {
*n == 0
}