deserr 0.6.4

Deserialization library with focus on error handling
Documentation
use std::convert::Infallible;

use deserr::{
    deserialize, errors::JsonError, take_cf_content, DeserializeError, Deserr, ErrorKind,
    ValuePointerRef,
};
use insta::{assert_debug_snapshot, assert_snapshot};
use serde_json::json;

#[test]
fn default_deny_unknown_fields() {
    #[allow(unused)]
    #[derive(Debug, Deserr)]
    #[deserr(deny_unknown_fields)]
    struct Struct {
        word: String,
    }

    let data = deserialize::<Struct, _, JsonError>(json!({ "word": "doggo" })).unwrap();

    assert_debug_snapshot!(data, @r###"
    Struct {
        word: "doggo",
    }
    "###);

    let data = deserialize::<Struct, _, JsonError>(json!({ "word": "doggo", "turbo": "doggo" }))
        .unwrap_err();

    assert_snapshot!(data, @"Unknown field `turbo`: expected one of `word`");
}

#[test]
fn custom_deny_unknown_fields() {
    #[allow(unused)]
    #[derive(Debug, Deserr)]
    #[deserr(deny_unknown_fields = custom_function)]
    struct Struct {
        word: String,
    }

    fn custom_function<E: DeserializeError>(
        field: &str,
        accepted: &[&str],
        location: ValuePointerRef,
    ) -> E {
        match field {
            "doggo" => take_cf_content(E::error::<Infallible>(
                None,
                ErrorKind::Unexpected {
                    msg: "The word is doggo, not the opposite".to_string(),
                },
                location,
            )),
            _ => take_cf_content(E::error::<Infallible>(
                None,
                deserr::ErrorKind::UnknownKey {
                    key: field,
                    accepted,
                },
                location,
            )),
        }
    }

    let data = deserialize::<Struct, _, JsonError>(json!({ "word": "doggo" })).unwrap();

    assert_debug_snapshot!(data, @r###"
    Struct {
        word: "doggo",
    }
    "###);

    let data = deserialize::<Struct, _, JsonError>(json!({ "word": "doggo", "turbo": "doggo" }))
        .unwrap_err();

    assert_snapshot!(data, @"Unknown field `turbo`: expected one of `word`");

    let data = deserialize::<Struct, _, JsonError>(json!({ "word": "doggo", "doggo": "word" }))
        .unwrap_err();

    assert_snapshot!(data, @"Invalid value: The word is doggo, not the opposite");
}