pub mod de;
pub mod se;
pub mod value;
pub mod errors;

extern crate pest;
#[macro_use]
extern crate pest_derive;

#[cfg(test)]
mod tests {
    use crate::de::deserialize;
    use crate::se::serialize;
    use crate::value::Primitive;
    use crate::value::TySONValue;

    #[test]
    fn de_se() {
        let data = r#"
        l|123|: hash{|s|: s|100|; a:s|100|};
        l|124|: hash{c|1|: s|100|, b|2|:s|100|},
        l|123|: ll[d|1|, e|2|],
        "#;

        let des = deserialize(data.to_string()).unwrap();
        println!("{:?}", des.items());
        assert_eq!(*des.items(), vec![(Primitive("l".to_string(), "123".to_string()),
                                       TySONValue::Map("hash".to_string(),
                                                       vec![(Primitive("".to_string(), "s".to_string()),
                                                             TySONValue::Primitive(Primitive("s".to_string(), "100".to_string()))),
                                                            (Primitive("a".to_string(), "".to_string()),
                                                             TySONValue::Primitive(Primitive("s".to_string(), "100".to_string())))])),
                                      (Primitive("l".to_string(), "124".to_string()),
                                       TySONValue::Map("hash".to_string(), vec![(Primitive("c".to_string(), "1".to_string()),
                                                                                 TySONValue::Primitive(Primitive("s".to_string(), "100".to_string()))),
                                                                                (Primitive("b".to_string(), "2".to_string()),
                                                                                 TySONValue::Primitive(Primitive("s".to_string(), "100".to_string())))])),
                                      (Primitive("l".to_string(), "123".to_string()),
                                       TySONValue::Vector("ll".to_string(), vec![TySONValue::Primitive(Primitive("d".to_string(), "1".to_string())),
                                                                                 TySONValue::Primitive(Primitive("e".to_string(), "2".to_string()))]))]);
        assert_eq!(serialize(&des), "l|123|:hash{|s|:s|100|,a:s|100|};l|124|:hash{c|1|:s|100|,b|2|:s|100|};l|123|:ll[d|1|,e|2|]".to_string())
    }
}
