Why is this an issue?

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

Resources

Documentation