json icon indicating copy to clipboard operation
json copied to clipboard

Errors from Visitor should point to beginning of the object

Open dtolnay opened this issue 8 years ago • 2 comments

In the following string validation, the error message points to the close quote after "test123". It would be nicer to point to the opening quote instead.

#[macro_use]
extern crate serde_derive;

extern crate serde;
extern crate serde_json;

use std::fmt;
use serde::de::{self, Deserializer, Visitor};

#[derive(Deserialize, Debug)]
struct Esheri3 {
    #[serde(deserialize_with = "letters_only")]
    name: String,
}

fn letters_only<'de, D>(deserializer: D) -> Result<String, D::Error>
where
    D: Deserializer<'de>,
{
    struct NameVisitor;

    impl<'de> Visitor<'de> for NameVisitor {
        type Value = String;

        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
            formatter.write_str("string containing only letters")
        }

        fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
        where
            E: de::Error,
        {
            if s.chars().all(char::is_alphabetic) {
                Ok(s.to_owned())
            } else {
                Err(de::Error::custom("name must only contain letters"))
            }
        }
    }

    deserializer.deserialize_string(NameVisitor)
}

fn main() {
    let j = r#"
        {
          "name": "test123"
        }
    "#;
    println!("{}", serde_json::from_str::<Esheri3>(j).unwrap_err());
}
name must only contain letters at line 3 column 27

dtolnay avatar Mar 24 '17 17:03 dtolnay

@dtolnay can it be closed now?

Horki avatar Apr 04 '21 18:04 Horki

@dtolnay @Horki Hey! Is this issue still open? I'm a Rust beginner and I would like to give it a shot!

jmj0502 avatar Mar 04 '24 03:03 jmj0502