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!()
}
}