Skip to content

Commit 46157b4

Browse files
jordensjaparic
authored andcommitted
add f64 ser/de and use macros
1 parent 149695b commit 46157b4

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed

src/de/mod.rs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,26 @@ macro_rules! deserialize_signed {
277277
}};
278278
}
279279

280+
macro_rules! deserialize_fromstr {
281+
($self:ident, $visitor:ident, $typ:ident, $visit_fn:ident, $pattern:expr) => {{
282+
let start = $self.index;
283+
loop {
284+
match $self.peek() {
285+
Some(c) => {
286+
if $pattern.iter().find(|&&d| d == c).is_some() {
287+
$self.eat_char();
288+
} else {
289+
let s = str::from_utf8(&$self.slice[start..$self.index]).unwrap();
290+
let v = $typ::from_str(s).or(Err(Error::InvalidNumber))?;
291+
return $visitor.$visit_fn(v);
292+
}
293+
},
294+
None => return Err(Error::EofWhileParsingNumber),
295+
}
296+
}
297+
}};
298+
}
299+
280300
impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
281301
type Error = Error;
282302

@@ -369,29 +389,15 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
369389
V: Visitor<'de>,
370390
{
371391
self.parse_whitespace().ok_or(Error::EofWhileParsingValue)?;
372-
let start = self.index;
373-
loop {
374-
match self.peek() {
375-
Some(b'-') | Some(b'0'..=b'9') | Some(b'.') | Some(b'e') | Some(b'E') => {
376-
self.eat_char();
377-
},
378-
Some(_) => {
379-
let s = str::from_utf8(&self.slice[start..self.index])
380-
.or(Err(Error::InvalidNumber))?;
381-
let v = f32::from_str(s)
382-
.or(Err(Error::InvalidNumber))?;
383-
return visitor.visit_f32(v);
384-
},
385-
None => return Err(Error::EofWhileParsingNumber),
386-
}
387-
}
392+
deserialize_fromstr!(self, visitor, f32, visit_f32, b"-0123456789.eE")
388393
}
389394

390-
fn deserialize_f64<V>(self, _visitor: V) -> Result<V::Value>
395+
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
391396
where
392397
V: Visitor<'de>,
393398
{
394-
unreachable!()
399+
self.parse_whitespace().ok_or(Error::EofWhileParsingValue)?;
400+
deserialize_fromstr!(self, visitor, f64, visit_f64, b"-0123456789.eE")
395401
}
396402

397403
fn deserialize_char<V>(self, _visitor: V) -> Result<V::Value>

src/ser/mod.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use core::{fmt, fmt::Write};
44

55
use serde::ser;
66

7-
use heapless::{String, Vec};
7+
use heapless::{String, Vec, consts::*};
88

99
use self::seq::SerializeSeq;
1010
use self::struct_::SerializeStruct;
@@ -123,6 +123,15 @@ macro_rules! serialize_signed {
123123
}};
124124
}
125125

126+
macro_rules! serialize_fmt {
127+
($self:ident, $uxx:ident, $fmt:expr, $v:expr) => {{
128+
let mut s: String<$uxx> = String::new();
129+
write!(&mut s, $fmt, $v).or(Err(Error::BufferFull))?;
130+
$self.buf.extend_from_slice(s.as_bytes())?;
131+
Ok(())
132+
}};
133+
}
134+
126135
impl<'a, B> ser::Serializer for &'a mut Serializer<B>
127136
where
128137
B: heapless::ArrayLength<u8>,
@@ -188,14 +197,11 @@ where
188197
}
189198

190199
fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
191-
let mut s: String<heapless::consts::U32> = String::new();
192-
write!(&mut s, "{:e}", v).unwrap();
193-
self.buf.extend_from_slice(s.as_bytes())?;
194-
Ok(())
200+
serialize_fmt!(self, U32, "{:e}", v)
195201
}
196202

197-
fn serialize_f64(self, _v: f64) -> Result<Self::Ok> {
198-
unreachable!()
203+
fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
204+
serialize_fmt!(self, U64, "{:e}", v)
199205
}
200206

201207
fn serialize_char(self, _v: char) -> Result<Self::Ok> {

0 commit comments

Comments
 (0)