use core::fmt;
use core::marker::PhantomData;
use crate::expecting::{self, Expecting};
use crate::Context;
pub trait NumberVisitor<'de, C: ?Sized + Context>: Sized {
type Ok;
fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
#[inline]
fn visit_u8(self, cx: &C, _: u8) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Unsigned8,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_u16(self, cx: &C, _: u16) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Unsigned16,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_u32(self, cx: &C, _: u32) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Unsigned32,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_u64(self, cx: &C, _: u64) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Unsigned64,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_u128(self, cx: &C, _: u128) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Unsigned128,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_i8(self, cx: &C, _: i8) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Signed8,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_i16(self, cx: &C, _: i16) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Signed16,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_i32(self, cx: &C, _: i32) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Signed32,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_i64(self, cx: &C, _: i64) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Signed64,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_i128(self, cx: &C, _: i128) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Signed128,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_f32(self, cx: &C, _: f32) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Float32,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_f64(self, cx: &C, _: f64) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Float64,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_usize(self, cx: &C, _: usize) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Usize,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_isize(self, cx: &C, _: isize) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Isize,
ExpectingWrapper::new(&self),
)))
}
#[inline]
fn visit_bytes(self, cx: &C, _: &'de [u8]) -> Result<Self::Ok, C::Error> {
Err(cx.message(expecting::bad_visitor_type(
&expecting::Number,
ExpectingWrapper::new(&self),
)))
}
}
#[repr(transparent)]
struct ExpectingWrapper<'a, T, C: ?Sized> {
inner: T,
_marker: PhantomData<&'a C>,
}
impl<'a, T, C: ?Sized> ExpectingWrapper<'a, T, C> {
#[inline]
fn new(value: &T) -> &Self {
unsafe { &*(value as *const T as *const Self) }
}
}
impl<'a, 'de, T, C> Expecting for ExpectingWrapper<'a, T, C>
where
C: ?Sized + Context,
T: NumberVisitor<'de, C>,
{
#[inline]
fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.inner.expecting(f)
}
}