use core::fmt;
use crate::de::SizeHint;
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub(crate) enum TypeHint {
Empty,
Bool,
Char,
Number(NumberHint),
Bytes(SizeHint),
String(SizeHint),
Sequence(SizeHint),
Map(SizeHint),
Variant,
Option,
}
impl fmt::Display for TypeHint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TypeHint::Empty => write!(f, "empty"),
TypeHint::Bool => write!(f, "bool"),
TypeHint::Char => write!(f, "char"),
TypeHint::Number(number) => number.fmt(f),
TypeHint::Bytes(size) => write!(f, "bytes with length {size}"),
TypeHint::String(size) => write!(f, "string with length {size}"),
TypeHint::Sequence(size) => write!(f, "sequence with length {size}"),
TypeHint::Map(size) => write!(f, "map with length {size}"),
TypeHint::Variant => write!(f, "variant"),
TypeHint::Option => write!(f, "option"),
}
}
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub(crate) enum NumberHint {
Integer(IntegerKind),
Float(FloatKind),
}
impl fmt::Display for NumberHint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
NumberHint::Integer(kind) => kind.fmt(f),
NumberHint::Float(kind) => kind.fmt(f),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[non_exhaustive]
pub(crate) enum IntegerKind {
U8,
U16,
U32,
U64,
U128,
I8,
I16,
I32,
I64,
I128,
}
impl IntegerKind {
#[cfg(target_pointer_width = "32")]
pub(crate) const USIZE: Self = IntegerKind::U32;
#[cfg(target_pointer_width = "64")]
pub(crate) const USIZE: Self = IntegerKind::U64;
#[cfg(target_pointer_width = "32")]
pub(crate) const ISIZE: Self = IntegerKind::I32;
#[cfg(target_pointer_width = "64")]
pub(crate) const ISIZE: Self = IntegerKind::I64;
#[inline]
pub(crate) const fn is_signed(self) -> bool {
matches!(
self,
IntegerKind::I8
| IntegerKind::I16
| IntegerKind::I32
| IntegerKind::I64
| IntegerKind::I128
)
}
}
impl fmt::Display for IntegerKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
IntegerKind::U8 => write!(f, "u8"),
IntegerKind::U16 => write!(f, "u16"),
IntegerKind::U32 => write!(f, "u32"),
IntegerKind::U64 => write!(f, "u64"),
IntegerKind::U128 => write!(f, "u128"),
IntegerKind::I8 => write!(f, "i8"),
IntegerKind::I16 => write!(f, "i16"),
IntegerKind::I32 => write!(f, "i32"),
IntegerKind::I64 => write!(f, "i64"),
IntegerKind::I128 => write!(f, "i128"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[non_exhaustive]
pub(crate) enum FloatKind {
F32,
F64,
}
impl fmt::Display for FloatKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FloatKind::F32 => write!(f, "f32"),
FloatKind::F64 => write!(f, "f64"),
}
}
}