edn-rs 0.19.0

[DEPRECATED]: Crate to parse and emit EDN
Documentation
use edn_rs::{Deserialize, Edn, EdnError};

#[derive(Debug, PartialEq)]
struct Person {
    name: String,
    age: u8,
}

impl Deserialize for Person {
    fn deserialize(edn: &Edn) -> Result<Self, EdnError> {
        Ok(Self {
            name: edn_rs::from_edn(&edn[":name"])?,
            age: edn_rs::from_edn(&edn[":age"])?,
        })
    }
}

fn person_ok() -> Result<(), EdnError> {
    let edn_str = "  {:name \"rose\" :age 66  }  ";
    let person: Person = edn_rs::from_str(edn_str)?;

    println!("{person:?}");
    // Person { name: "rose", age: 66 }

    assert_eq!(
        person,
        Person {
            name: "rose".to_string(),
            age: 66,
        }
    );
    Ok(())
}

fn person_mistyped() {
    let bad_edn_str = "{:name \"rose\" :age \"some text\" }";
    let person: Result<Person, EdnError> = edn_rs::from_str(bad_edn_str);

    assert_eq!(
        person,
        Err(EdnError::Deserialize(
            "couldn't convert `\"some text\"` into `uint`".to_string()
        ))
    );
}

fn person_overflow() {
    let overflow_edn_str = "  {:name \"rose\" :age 9002  }  ";
    let person: Result<Person, EdnError> = edn_rs::from_str(overflow_edn_str);

    assert_eq!(
        format!("{person:?}"),
        "Err(TryFromInt(TryFromIntError(())))"
    );
}

fn main() -> Result<(), EdnError> {
    person_ok()?;
    person_mistyped();
    person_overflow();

    Ok(())
}

#[test]
fn test_person_ok() {
    let _ = person_ok().unwrap();
}

#[test]
fn test_person_mistyped() {
    person_mistyped();
}

#[test]
fn test_person_overflow() {
    person_overflow();
}