#![warn(bare_trait_objects)]
#![warn(clippy::pedantic)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "serde")]
extern crate serde;
#[cfg(feature = "std")]
#[doc(hidden)]
pub mod lstd {
pub use std::*;
}
#[cfg(not(feature = "std"))]
#[doc(hidden)]
pub mod lstd {
pub use core::*;
}
#[cfg(feature = "serde")]
#[doc(hidden)]
pub use serde::*;
#[macro_export]
macro_rules! gen_boolean_enum {
($name:ident) => (
$crate::_gen_boolean_enum_gen_enum!($name);
$crate::_gen_boolean_enum_common!($name);
);
(pub $name:ident) => (
$crate::_gen_boolean_enum_gen_enum!(pub $name);
$crate::_gen_boolean_enum_common!($name);
);
(serde $name:ident) => (
$crate::_gen_boolean_enum_gen_enum!($name);
$crate::_gen_boolean_enum_common!($name);
$crate::_gen_boolean_enum_serde!($name);
);
(pub serde $name:ident) => (
$crate::_gen_boolean_enum_gen_enum!(pub $name);
$crate::_gen_boolean_enum_common!($name);
$crate::_gen_boolean_enum_serde!($name);
);
(serde pub $name:ident) => (
$crate::gen_boolean_enum!(pub serde $name);
)
}
#[doc(hidden)]
#[macro_export]
macro_rules! _gen_boolean_enum_common {
($name:ident) => (
impl From<bool> for $name {
fn from(x: bool) -> Self {
if x {
$name::Yes
} else {
$name::No
}
}
}
impl Into<bool> for $name {
fn into(self) -> bool {
match self {
$name::Yes => true,
$name::No => false
}
}
}
impl Default for $name {
fn default() -> Self {
$name::No
}
}
impl $crate::lstd::ops::Not for $name {
type Output = Self;
fn not(self) -> Self::Output {
if self.into() {
$name::No
} else {
$name::Yes
}
}
}
)
}
#[doc(hidden)]
#[macro_export]
macro_rules! _gen_boolean_enum_gen_enum {
($name:ident) => (
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum $name {
Yes,
No
}
);
(pub $name:ident) => (
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum $name {
Yes,
No
}
);
}
#[cfg(not(feature = "serde"))]
#[doc(hidden)]
#[macro_export]
macro_rules! _gen_boolean_enum_serde {
( $( $t:tt )* ) => (
compile_error!("the \"serde\" feature is not enabled");
)
}
#[cfg(feature = "serde")]
#[doc(hidden)]
#[macro_export]
macro_rules! _gen_boolean_enum_serde {
($name:ident) => (
impl $crate::Serialize for $name {
fn serialize<S>(
&self,
serializer: S
) -> $crate::lstd::result::Result<S::Ok, S::Error>
where S: $crate::Serializer {
serializer.serialize_bool((*self).into())
}
}
impl<'de> $crate::Deserialize<'de> for $name {
fn deserialize<D>(
deserializer: D
) -> $crate::lstd::result::Result<$name, D::Error>
where D: $crate::Deserializer<'de> {
struct BooleanEnumVisitor;
impl<'de> $crate::de::Visitor<'de>
for BooleanEnumVisitor {
type Value = $name;
fn expecting(
&self,
formatter: &mut $crate::lstd::fmt::Formatter
) -> $crate::lstd::fmt::Result {
formatter.write_str("a boolean value")
}
fn visit_bool<E>(
self,
value: bool
) -> $crate::lstd::result::Result<Self::Value, E>
where E: $crate::de::Error {
Ok($name::from(value))
}
}
deserializer.deserialize_bool(BooleanEnumVisitor)
}
}
)
}