Skip to content

Commit 0d71ac8

Browse files
committed
Render 128-bit integer value into Visitor errors
1 parent 82c3eb7 commit 0d71ac8

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

serde/src/de/format.rs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use lib::fmt::{self, Write};
2+
use lib::str;
3+
4+
pub struct Buf<'a> {
5+
bytes: &'a mut [u8],
6+
offset: usize,
7+
}
8+
9+
impl<'a> Buf<'a> {
10+
pub fn new(bytes: &'a mut [u8]) -> Self {
11+
Buf { bytes, offset: 0 }
12+
}
13+
14+
pub fn as_str(&self) -> &str {
15+
let slice = &self.bytes[..self.offset];
16+
unsafe { str::from_utf8_unchecked(slice) }
17+
}
18+
}
19+
20+
impl<'a> Write for Buf<'a> {
21+
fn write_str(&mut self, s: &str) -> fmt::Result {
22+
if self.offset + s.len() > self.bytes.len() {
23+
Err(fmt::Error)
24+
} else {
25+
self.bytes[self.offset..self.offset + s.len()].copy_from_slice(s.as_bytes());
26+
self.offset += s.len();
27+
Ok(())
28+
}
29+
}
30+
}

serde/src/de/mod.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ use lib::*;
118118

119119
pub mod value;
120120

121+
#[cfg(not(no_integer128))]
122+
mod format;
121123
mod ignored_any;
122124
mod impls;
123125
mod utf8;
@@ -1366,8 +1368,10 @@ pub trait Visitor<'de>: Sized {
13661368
where
13671369
E: Error,
13681370
{
1369-
let _ = v;
1370-
Err(Error::invalid_type(Unexpected::Other("i128"), &self))
1371+
let mut buf = [0u8; 58];
1372+
let mut writer = format::Buf::new(&mut buf);
1373+
fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as i128", v)).unwrap();
1374+
Err(Error::invalid_type(Unexpected::Other(writer.as_str()), &self))
13711375
}
13721376
}
13731377

@@ -1426,8 +1430,10 @@ pub trait Visitor<'de>: Sized {
14261430
where
14271431
E: Error,
14281432
{
1429-
let _ = v;
1430-
Err(Error::invalid_type(Unexpected::Other("u128"), &self))
1433+
let mut buf = [0u8; 57];
1434+
let mut writer = format::Buf::new(&mut buf);
1435+
fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as u128", v)).unwrap();
1436+
Err(Error::invalid_type(Unexpected::Other(writer.as_str()), &self))
14311437
}
14321438
}
14331439

test_suite/tests/test_de_error.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ fn test_i128() {
192192
let error = <&str>::deserialize(deserializer).unwrap_err();
193193
assert_eq!(
194194
error.to_string(),
195-
"invalid type: i128, expected a borrowed string",
195+
"invalid type: integer `1` as i128, expected a borrowed string",
196196
);
197197
}
198198

@@ -372,7 +372,7 @@ fn test_u128() {
372372
let error = <&str>::deserialize(deserializer).unwrap_err();
373373
assert_eq!(
374374
error.to_string(),
375-
"invalid type: u128, expected a borrowed string",
375+
"invalid type: integer `1` as u128, expected a borrowed string",
376376
);
377377
}
378378

0 commit comments

Comments
 (0)