From 3c0fbdd9d0c1f7d6367754237ca4b9662e76a86b Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Sun, 13 Sep 2026 13:32:17 -0700 Subject: [PATCH 1/2] Reject uppercase hashes when deserializing --- src/hash.rs | 26 +------------------------- src/language.rs | 8 +------- src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/hash.rs b/src/hash.rs index 36d0f2a8..984108c5 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -1,6 +1,6 @@ use super::*; -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +#[derive(Clone, Copy, Debug, DeserializeFromStr, Eq, Hash, PartialEq, SerializeDisplay)] pub struct Hash(blake3::Hash); impl Hash { @@ -65,30 +65,6 @@ impl PartialOrd for Hash { } } -impl Serialize for Hash { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - self.0.to_string().serialize(serializer) - } -} - -impl<'de> Deserialize<'de> for Hash { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - use serde::de::{Error, Unexpected}; - - let s = String::deserialize(deserializer)?; - - Ok(Self(s.parse::().map_err(|_| { - D::Error::invalid_value(Unexpected::Str(&s), &"64 hex digits") - })?)) - } -} - impl Display for Hash { fn fmt(&self, f: &mut Formatter) -> fmt::Result { Display::fmt(&self.0, f) diff --git a/src/language.rs b/src/language.rs index 0256ab98..0f258168 100644 --- a/src/language.rs +++ b/src/language.rs @@ -190,7 +190,7 @@ pub(crate) static CODES: LazyLock> = LazyLo .into() }); -#[derive(Clone, Copy, Debug, DeserializeFromStr, PartialEq)] +#[derive(Clone, Copy, Debug, DeserializeFromStr, PartialEq, SerializeDisplay)] pub(crate) struct Language(&'static str); impl Language { @@ -216,12 +216,6 @@ impl FromStr for Language { } } -impl Serialize for Language { - fn serialize(&self, serializer: S) -> Result { - serializer.serialize_str(self.0) - } -} - impl Decode for Language { fn decode(decoder: &mut Decoder) -> Result { decoder.text()?.parse().context(decode_error::Language) diff --git a/src/lib.rs b/src/lib.rs index 72ea25df..ad6575fd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -178,7 +178,7 @@ use { num_traits::One, owo_colors::Styled, regex::Regex, - serde::{Deserialize, Deserializer, Serialize, Serializer}, + serde::{Deserialize, Serialize, Serializer}, serde_with::{ DeserializeFromStr, MapPreventDuplicates, SerializeDisplay, SetPreventDuplicates, serde_as, skip_serializing_none, From 39e2000a9def9cf434383a655c9d390e537efa95 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Sun, 13 Sep 2026 13:34:45 -0700 Subject: [PATCH 2/2] Revise --- src/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hash.rs b/src/hash.rs index 984108c5..34f50bf3 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -127,7 +127,7 @@ mod tests { serde_json::from_str::("\"foo\"") .unwrap_err() .to_string(), - r#"invalid value: string "foo", expected 64 hex digits"#, + "expected 64 hex bytes, received 3 at line 1 column 5", ); }