From 6e61148bec46721db260609712c73bb7c542fb89 Mon Sep 17 00:00:00 2001 From: Giacomo Cavalieri Date: Tue, 26 Aug 2025 23:18:42 +0200 Subject: [PATCH] update deserialising to use `String` instead of `&str` --- src/version.rs | 22 +++++++++++++++++++--- src/version/lexer.rs | 4 ++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/version.rs b/src/version.rs index 5d7b5fa..2079e07 100644 --- a/src/version.rs +++ b/src/version.rs @@ -7,7 +7,7 @@ use std::{cmp::Ordering, convert::TryFrom, fmt}; use self::parser::Parser; use serde::{ Deserialize, Serialize, - de::{self, Deserializer}, + de::{self, Deserializer, Visitor}, }; mod lexer; @@ -153,8 +153,24 @@ impl<'de> Deserialize<'de> for Version { where D: Deserializer<'de>, { - let s: &str = Deserialize::deserialize(deserializer)?; - Version::try_from(s).map_err(de::Error::custom) + deserializer.deserialize_str(VersionVisitor) + } +} + +struct VersionVisitor; + +impl<'de> Visitor<'de> for VersionVisitor { + type Value = Version; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a Hex version string") + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + Version::try_from(value).map_err(de::Error::custom) } } diff --git a/src/version/lexer.rs b/src/version/lexer.rs index a316c7b..1c4811f 100644 --- a/src/version/lexer.rs +++ b/src/version/lexer.rs @@ -122,7 +122,7 @@ pub struct Lexer<'input> { impl<'input> Lexer<'input> { /// Construct a new lexer for the given input. - pub fn new(input: &str) -> Lexer { + pub fn new(input: &str) -> Lexer<'_> { let mut chars = input.char_indices(); let c1 = chars.next(); let c2 = chars.next(); @@ -263,7 +263,7 @@ impl<'input> Iterator for Lexer<'input> { mod tests { use super::*; - fn lex(input: &str) -> Vec { + fn lex(input: &str) -> Vec> { Lexer::new(input).map(Result::unwrap).collect::>() }