use std::fmt;
use std::fmt::Debug;
use std::fmt::Display;
use std::fmt::Formatter;
use std::time::Duration;
#[non_exhaustive]
#[must_use]
#[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),
}
}
}