Skip to content

Commit ce86dba

Browse files
update deserialising to use String instead of &str
1 parent 1c5f82e commit ce86dba

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/version.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{cmp::Ordering, convert::TryFrom, fmt};
77
use self::parser::Parser;
88
use serde::{
99
Deserialize, Serialize,
10-
de::{self, Deserializer},
10+
de::{self, Deserializer, Visitor},
1111
};
1212

1313
mod lexer;
@@ -153,8 +153,31 @@ impl<'de> Deserialize<'de> for Version {
153153
where
154154
D: Deserializer<'de>,
155155
{
156-
let s: &str = Deserialize::deserialize(deserializer)?;
157-
Version::try_from(s).map_err(de::Error::custom)
156+
deserializer.deserialize_any(VersionVisitor)
157+
}
158+
}
159+
160+
struct VersionVisitor;
161+
162+
impl<'de> Visitor<'de> for VersionVisitor {
163+
type Value = Version;
164+
165+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
166+
formatter.write_str("a Hex version string")
167+
}
168+
169+
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
170+
where
171+
E: de::Error,
172+
{
173+
Version::try_from(value).map_err(de::Error::custom)
174+
}
175+
176+
fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
177+
where
178+
E: de::Error,
179+
{
180+
Version::try_from(value.as_str()).map_err(de::Error::custom)
158181
}
159182
}
160183

@@ -163,7 +186,7 @@ impl Serialize for Version {
163186
where
164187
S: serde::Serializer,
165188
{
166-
serializer.serialize_str(&self.to_string())
189+
String::serialize(&self.to_string(), serializer)
167190
}
168191
}
169192

src/version/lexer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ pub struct Lexer<'input> {
122122

123123
impl<'input> Lexer<'input> {
124124
/// Construct a new lexer for the given input.
125-
pub fn new(input: &str) -> Lexer {
125+
pub fn new(input: &str) -> Lexer<'_> {
126126
let mut chars = input.char_indices();
127127
let c1 = chars.next();
128128
let c2 = chars.next();
@@ -263,7 +263,7 @@ impl<'input> Iterator for Lexer<'input> {
263263
mod tests {
264264
use super::*;
265265

266-
fn lex(input: &str) -> Vec<Token> {
266+
fn lex(input: &str) -> Vec<Token<'_>> {
267267
Lexer::new(input).map(Result::unwrap).collect::<Vec<_>>()
268268
}
269269

0 commit comments

Comments
 (0)