Serde is a popular framework in the Rust ecosystem for serializing and deserializing data. It provides a flexible and efficient way to convert Rust
data structures into various formats (e.g., JSON, YAML) and vice versa.
One of the core components of Serde is the Visitor trait, which allows custom deserialization logic by visiting each element of the
data structure. According to Serde’s documentation, any
implementation of the Visitor trait that implements the visit_string method must also implement the visit_str
method. Failing to do so can lead to unexpected behavior.
This rule ensures that implementations of the Visitor trait adhere to this requirement, promoting correctness and preventing subtle
bugs in deserialization logic.
Code examples
Noncompliant code example
struct A;
impl<'de> serde::de::Visitor<'de> for A {
type Value = ();
fn expecting(&self, _: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
unimplemented!()
}
fn visit_string<E>(self, _v: String) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
unimplemented!()
}
}
Compliant solution
impl<'de> serde::de::Visitor<'de> for A {
type Value = ();
fn expecting(&self, _: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
unimplemented!()
}
fn visit_str<E>(self, _v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
unimplemented!()
}
fn visit_string<E>(self, _v: String) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
unimplemented!()
}
}