deserr 0.6.4

Deserialization library with focus on error handling
Documentation
use deserr::{deserialize, errors::JsonError, Deserr};
use insta::{assert_debug_snapshot, assert_snapshot};
use serde_json::json;

#[test]
fn tagged_enum() {
    #[allow(unused)]
    #[derive(Debug, Deserr)]
    struct Struct {
        either: Either,
    }

    #[allow(unused)]
    #[derive(Debug, Deserr)]
    #[deserr(tag = "type")]
    enum Either {
        Left { doggo: String },
        Right { doggo: bool, catto: String },
    }

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

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

    let data = deserialize::<Struct, _, JsonError>(
        json!({ "either": { "type": "Right", "doggo": false, "catto": "jorts" } }),
    )
    .unwrap();

    assert_debug_snapshot!(data, @r###"
    Struct {
        either: Right {
            doggo: false,
            catto: "jorts",
        },
    }
    "###);

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

    assert_snapshot!(data, @"Missing field `type` inside `.either`");

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

    assert_snapshot!(data, @"Missing field `type` inside `.either`");
}
#[test]
fn tagged_enum_plus_rename() {
    #[allow(unused)]
    #[derive(Debug, Deserr)]
    struct Struct {
        either: Either,
    }

    #[allow(unused)]
    #[derive(Debug, Deserr)]
    #[deserr(tag = "type", rename_all = lowercase)]
    enum Either {
        Left {
            doggo: String,
        },
        #[deserr(rename = "RIGHT")]
        Right {
            doggo: bool,
            catto: String,
        },
    }

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

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

    let data = deserialize::<Struct, _, JsonError>(
        json!({ "either": { "type": "RIGHT", "doggo": false, "catto": "jorts" } }),
    )
    .unwrap();

    assert_debug_snapshot!(data, @r###"
    Struct {
        either: Right {
            doggo: false,
            catto: "jorts",
        },
    }
    "###);

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

    assert_debug_snapshot!(data, @r###"
    JsonError(
        "Invalid value at `.either`: Incorrect tag value",
    )
    "###);

    let data = deserialize::<Struct, _, JsonError>(
        json!({ "either": { "type": "Right", "doggo": false, "catto": "jorts" } }),
    )
    .unwrap_err();

    assert_debug_snapshot!(data, @r###"
    JsonError(
        "Invalid value at `.either`: Incorrect tag value",
    )
    "###);
}