kv3 0.1.1

kv3 (keyvalues 3) format parser with serde support
Documentation
#[cfg(feature = "serde")]
#[cfg(test)]
mod tests {
    use log::{error, info};
    use serde::{Deserialize, Serialize};

    use crate::kv3_serde::serde_kv3;

    #[derive(Deserialize, Serialize)]
    struct TestNestedObj {
        obj: NestedObj,
        data: i32,
    }

    #[derive(Deserialize, Serialize)]
    struct NestedObj {
        obj1: SomeObj,
    }

    #[test]
    fn kv3_serde_parse_object_nested() {
        let input = r#"
{
  data = 5
  obj = {
    obj1 = {
      data = 5
    }
  }
}
"#;

        match serde_kv3::<TestNestedObj>(input) {
            Ok(data) => {
                assert_eq!(data.data, 5);
            }
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test")
            }
        }
    }

    #[derive(Deserialize, Serialize)]
    struct SomeObj {
        data: i32,
    }

    #[derive(Deserialize, Serialize)]
    struct SomeObjEmpty {}

    #[derive(Deserialize, Serialize)]
    struct ObjTest {
        obj1: SomeObjEmpty,
        obj2: SomeObjEmpty,
        obj3: SomeObjEmpty,
        obj4: SomeObjEmpty,
    }

    #[test]
    fn kv3_serde_parse_object() {
        let input = r#"
    <!-- test 3 -->
{
  // comment
  obj1 = {}
  obj2 = { }
  obj3 = { 
  }
  obj4 =
  { 
  }
}
"#;

        match serde_kv3::<ObjTest>(input) {
            Ok(_) => {}
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test")
            }
        }
    }

    #[derive(Debug, Deserialize, Serialize)]
    struct ArrayTest {
        array1: Vec<i32>,
        array2: Vec<i32>,
        array3: Vec<i32>,
        array4: Vec<i32>,
    }

    #[test]
    fn kv3_serde_parse_array_faulty() {
        let input = r#"
         <!-- test 3 -->
     {
       // comment
       array1 = []
       array2 = [ ]
       array3 = [
       ]
       array4 = asd
       [
       ]
     }
     "#;

        match serde_kv3::<ArrayTest>(input) {
            Ok(_) => {}
            Err(e) => {
                error!("error {:?}", e);
            }
        }
    }

    #[derive(Debug, Serialize, Deserialize)]
    struct ArrayTest2 {
        array_ints: Vec<i64>,
    }

    #[test]
    fn kv3_serde_parse_array() {
        let input = r#"
     {
       array_empty = []
       array_whitespace = [ ]
       array_mixed = [1, 2.5, true, "string"]
       array_nested = [1, [2, 3], 4]
       array_floats = [1.1, -2.2, 3.3]
       array_ints = [1, 2, 3, 4]
       array_nl = 
       [
       ]
       m_MassProperties = 
       [
           11629.881836,
           -4467.779785,
           -2793.832764,
           -703.485962
       ]
       m_MassProperties2 = 
       [
           5.0,
           4.0,
       ]
     }
    "#;

        match serde_kv3::<ArrayTest2>(input) {
            Ok(data) => {
                info!("{:?}", data);
            }
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test {:?}", e)
            }
        }
    }

    #[derive(Deserialize, Serialize)]
    struct Test {
        #[serde(rename = "m_nFlags")]
        flags: f32,
        #[serde(rename = "m_nRefCounter")]
        ref_counter: i32,
    }

    #[test]
    fn kv3_serde_parse_input_numbers() {
        let input = r#"
              <!-- test 3 -->
          {
            m_nFlags = 5.0
            m_nRefCounter = 5
            m_string = "some string"
             multiLineStringValue = """
     First line of a multi-line string literal.
     Second line of a multi-line string literal.
     """
          }
          "#;

        match serde_kv3::<Test>(input) {
            Ok(_) => {}
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test")
            }
        }
    }

    #[derive(Deserialize, Serialize)]
    struct Test2 {
        #[serde(rename = "array1")]
        array1: Vec<i64>,
    }

    #[test]
    fn kv3_serde_parse_input_comments() {
        let input = r#"
              <!-- test 3 -->
          {
              // test 2
              <!-- test 3 -->
              array1 = [1] // test
              num = 5 /*
              ok
              */
              float = 5.0
              obj = {}
          }
          "#;

        match serde_kv3::<Test2>(input) {
            Ok(_) => {}
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test")
            }
        }
    }

    #[derive(Debug, Deserialize, Serialize)]
    struct WorldPhys {
        #[serde(rename = "m_nFlags")]
        flags: i64,
    }

    #[derive(Debug, Deserialize, Serialize)]
    struct SerdeParseTest2 {
        #[serde(rename = "num")]
        num: i64,
    }
    #[test]
    fn kv3_serde_parse_test2() {
        let input = r#"
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
          {
            m_nFlags = 0
            m_nRefCounter = 0
            m_bonesHash = 
            [
            ]
            m_boneNames = 
            [
            ]
            m_indexNames = 
            [
            ]
            m_indexHash = 
            [
            ]
            m_Planes = 
            #[
                00 00 00 00 00 00 00 00 00 00 80 3F 00 00 40 43 E8 83 84 3E EB 46 77 BF C2 BD 77 35 42 C9 EB C3
                40 48 24 3F C9 13 30 3E 24 56 3F BF 49 AD 05 C4 00 00 00 00 00 00 00 00 00 00 80 BF 00 00 38 C3
                E8 83 84 BE EB 46 77 3F C2 BD 77 B5 42 C9 EF 43 E9 46 77 BF F4 83 84 BE 00 00 00 00 CD 35 18 44
                E9 46 77 3F F4 83 84 3E 00 00 00 00 CD 35 13 C4 F5 83 84 3E EB 46 77 BF 00 00 00 00 52 C9 EF C3
                E9 46 77 BF F4 83 84 BE 00 00 00 00 CD 35 18 44 8B 3D 80 34 B8 4C 6F B5 00 00 80 BF 1D 00 40 C3
                E9 46 77 BF F4 83 84 BE 00 00 00 00 CD 35 18 44 F5 83 84 BE EB 46 77 3F 00 00 00 00 52 C9 EB 43
                E9 46 77 3F F4 83 84 3E 00 00 00 00 CD 35 13 C4 8B 3D 80 34 B8 4C 6F B5 00 00 80 BF 1D 00 40 C3
                ED 46 77 BF D1 83 84 BE 00 00 00 00 D4 35 18 44 69 3D 80 B4 BB 4C 6F 35 00 00 80 3F 1C 00 38 43
                ED 46 77 3F D1 83 84 3E 00 00 00 00 D4 75 15 C4 D2 83 84 BE EF 46 77 3F 00 00 00 00 3C C9 EB 43
                F4 83 84 3E E9 46 77 BF 00 00 00 00 50 C9 EB C3 EB 46 77 BF F5 83 84 BE 00 00 00 00 CE 35 13 44
                F4 83 84 BE E9 46 77 3F 00 00 00 00 50 C9 EF 43 1C D1 38 BF 14 16 46 BE D6 13 2A BF E8 45 9C 43
                19 D1 38 BF 54 16 46 BE D6 13 2A BF 2C 4B A2 43 0C 84 84 3E E7 46 77 BF 00 00 2E 35 5C C9 EF C3
                19 D1 38 3F 54 16 46 3E D6 13 2A 3F DA 45 9C C3 44 48 24 BF 8C 13 30 BE 25 56 3F 3F 50 AD 05 44
                19 D1 38 3F 54 16 46 3E D6 13 2A 3F DA 45 9C C3 0C 84 84 BE E7 46 77 3F 00 00 2E B5 5B C9 EB 43
                19 D1 38 BF 54 16 46 BE D6 13 2A BF 2C 4B A2 43 44 48 24 BF 8C 13 30 BE 25 56 3F 3F 50 AD 05 44
                F4 83 84 BE E9 46 77 3F 00 00 00 00 50 C9 EF 43 EB 46 77 BF F5 83 84 BE 00 00 00 80 CD 75 15 44
                F4 83 84 3E E9 46 77 BF 00 00 00 00 50 C9 EB C3 1C D1 38 3F 14 16 46 3E D6 13 2A 3F 3A 4B A2 C3
                F4 83 84 3E E9 46 77 BF 00 00 00 00 50 C9 EB C3 EB 46 77 3F F5 83 84 3E 00 00 00 00 CE 35 18 C4
                F4 83 84 BE E9 46 77 3F 00 00 00 00 50 C9 EF 43 00 00 00 00 00 00 00 00 00 00 80 3F 00 00 38 43
                ED 46 77 3F D1 83 84 3E 00 00 00 00 D4 75 15 C4 69 3D 80 B4 BB 4C 6F 35 00 00 80 3F 1D 00 38 43
                ED 46 77 BF D1 83 84 BE 00 00 00 00 D4 35 18 44 D2 83 84 3E EF 46 77 BF 00 00 00 00 3C C9 EF C3
                F4 83 84 BE E9 46 77 3F 00 00 00 00 50 C9 EF 43 EB 46 77 3F F5 83 84 3E 00 00 00 80 CE 35 18 C4
                F4 83 84 3E E9 46 77 BF 00 00 00 00 50 C9 EB C3 00 00 00 00 00 00 00 80 00 00 80 BF 00 00 40 C3
                00 00 00 00 00 00 00 00 00 00 80 BF 00 00 38 C3 F5 83 84 BE EB 46 77 3F 00 00 00 00 52 C9 EB 43
                00 00 00 00 00 00 00 00 00 00 80 3F 00 00 40 43 EB 46 77 3F E8 83 84 3E 00 00 00 80 D0 35 18 C4
                00 00 00 00 00 00 00 00 00 00 80 3F 00 00 40 43 F5 83 84 3E EB 46 77 BF 00 00 00 00 52 C9 EF C3
                00 00 00 00 00 00 00 00 00 00 80 BF 00 00 38 C3 EB 46 77 3F E8 83 84 3E 00 00 00 00 D0 35 18 C4
            ]
            m_bindPose = 
            [
            ]
              // test 2
              <!-- test 3 -->
              array1 = [1] // test
              num = 5 /*
              ok
              */
              float = 5.0
              obj = {}
              obj2 = 
              {
                arr = [5]
                arr2 = #[FF FF FF]
              }
            m_MassProperties = 
            [
                11629.881836,
                -4467.779785,
                -2793.832764,
                -703.485962,
                -4467.779785,
                27106.720703,
                -748.609741,
                303.850525,
                -2793.832764,
                -748.609741,
                28452.515625,
                188.387100,
            ]
            m_parts = 
            [
                
                {
                    m_nFlags = 2
                    m_flMass = 0.000000
                    m_rnShape = 
                    {
                        m_spheres = 
                        [
                        ]
                        m_capsules = 
                        [
                        ]
                        m_hulls = 
                        [
                        ]
                    }
                }
            ]
            test = 
            [
              5,
            ]
        }
          "#;
        match serde_kv3::<SerdeParseTest2>(input) {
            Ok(data) => {
                println!("{:?}", data);
            }
            Err(e) => {
                error!("error {:?}", e);
                panic!("expected to pass the test {:?}", e);
            }
        }
    }
}