use std::fmt::{
self,
Debug,
Display,
Formatter,
};
use std::time::Duration;
#[non_exhaustive]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub enum ArgumentValue {
Signed(i128),
Unsigned(u128),
Float32(u32),
Float64(u64),
Duration(Duration),
}
macro_rules! impl_from_signed_integer {
($($source:ty),+ $(,)?) => {
$(
impl From<$source> for ArgumentValue {
#[inline]
fn from(value: $source) -> Self {
Self::Signed(value as i128)
}
}
)+
};
}
macro_rules! impl_from_unsigned_integer {
($($source:ty),+ $(,)?) => {
$(
impl From<$source> for ArgumentValue {
#[inline]
fn from(value: $source) -> Self {
Self::Unsigned(value as u128)
}
}
)+
};
}
impl_from_signed_integer!(i8, i16, i32, i64, i128, isize);
impl_from_unsigned_integer!(u8, u16, u32, u64, u128, usize);
impl From<f32> for ArgumentValue {
#[inline]
fn from(value: f32) -> Self {
Self::Float32(value.to_bits())
}
}
impl From<f64> for ArgumentValue {
#[inline]
fn from(value: f64) -> Self {
Self::Float64(value.to_bits())
}
}
impl From<Duration> for ArgumentValue {
#[inline]
fn from(value: Duration) -> Self {
Self::Duration(value)
}
}
impl Debug for ArgumentValue {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Signed(value) => {
formatter.debug_tuple("Signed").field(value).finish()
}
Self::Unsigned(value) => {
formatter.debug_tuple("Unsigned").field(value).finish()
}
Self::Float32(bits) => formatter
.debug_tuple("Float32")
.field(&f32::from_bits(*bits))
.finish(),
Self::Float64(bits) => formatter
.debug_tuple("Float64")
.field(&f64::from_bits(*bits))
.finish(),
Self::Duration(value) => {
formatter.debug_tuple("Duration").field(value).finish()
}
}
}
}
impl Display for ArgumentValue {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Signed(value) => Display::fmt(value, formatter),
Self::Unsigned(value) => Display::fmt(value, formatter),
Self::Float32(bits) => {
Display::fmt(&f32::from_bits(*bits), formatter)
}
Self::Float64(bits) => {
Display::fmt(&f64::from_bits(*bits), formatter)
}
Self::Duration(value) => Debug::fmt(value, formatter),
}
}
}