protobuf-lite 0.1.4

decode protobuf as hashmap
Documentation
pub mod buffer;
pub mod error;
pub mod fixint;
mod json;
pub mod protobuf;
pub mod varint;

#[cfg(test)]
mod tests {
    use super::*;
    use crate::buffer::Reader;
    use crate::protobuf::ProtoData::Message;
    use crate::protobuf::{decode_protobuf, Map, ProtoData};
    use std::vec;

    #[test]
    fn test_decode_protobuf() {
        let pb = read_protobuf(
            "08d2fe061d424b1d002952bf0100000000003a0d3131343531343139313938313042047468697342026973420161420872657065617465644206737472696e674a10ec9962d372ce9be816be0b7fdea0127b5210292c88aab6b4386c5259b3db5bb3d83552106c67dcd74452b07dbab383af60213edc5210625b2652e828a520e2d3738fbc7623f952105c4627267501260e1635696f21df442352100e4f254dabe6afe218d47229213fce2e5210d61fea3ad5f6c7de29cb530974daebe85210bd7969536028618e616db54cc5bc17ab5210b82c3166710a0373d0fae7bfa5da6a405210aacb0a4e4eb2400cf3a9674cbd9fac30521056b3e167c737ac1d52770b789ba1e04a5210d99426dc60b67af15121a38816fa33c35210328fce15be2219c6cd950241d9db083652102db0c75a59f5527584b2924a32995f625210258d410b8fcf29b7c8405ae99560d43a5210eeafec9d7d49109a08d5d36f26e5f94852107aa31e3a68c0ea5cf197a9613a68de46",
        )
        .unwrap();

        println!("{}", pb);

        let mut expect_pb = Map::new();
        expect_pb.insert(1, ProtoData::Varint(114514));
        expect_pb.insert(3, ProtoData::Fix32(1919810));
        expect_pb.insert(5, ProtoData::Fix64(114514));
        expect_pb.insert(7, ProtoData::String("1145141919810".to_string()));
        expect_pb.insert(
            8,
            ProtoData::Repeated(vec![
                ProtoData::String("this".to_string()),
                ProtoData::String("is".to_string()),
                ProtoData::String("a".to_string()),
                ProtoData::String("repeated".to_string()),
                ProtoData::String("string".to_string()),
            ]),
        );
        expect_pb.insert(
            9,
            ProtoData::Bytes(
                hex::decode("ec 99 62 d3 72 ce 9b e8 16 be 0b 7f de a0 12 7b".replace(" ", ""))
                    .unwrap(),
            ),
        );
        expect_pb.insert(
            10,
            ProtoData::Repeated(vec![
                ProtoData::Bytes(
                    hex::decode("29 2c 88 aa b6 b4 38 6c 52 59 b3 db 5b b3 d8 35".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("6c 67 dc d7 44 52 b0 7d ba b3 83 af 60 21 3e dc".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("62 5b 26 52 e8 28 a5 20 e2 d3 73 8f bc 76 23 f9".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("5c 46 27 26 75 01 26 0e 16 35 69 6f 21 df 44 23".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("0e 4f 25 4d ab e6 af e2 18 d4 72 29 21 3f ce 2e".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("d6 1f ea 3a d5 f6 c7 de 29 cb 53 09 74 da eb e8".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("bd 79 69 53 60 28 61 8e 61 6d b5 4c c5 bc 17 ab".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("b8 2c 31 66 71 0a 03 73 d0 fa e7 bf a5 da 6a 40".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("aa cb 0a 4e 4e b2 40 0c f3 a9 67 4c bd 9f ac 30".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("56 b3 e1 67 c7 37 ac 1d 52 77 0b 78 9b a1 e0 4a".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("d9 94 26 dc 60 b6 7a f1 51 21 a3 88 16 fa 33 c3".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("32 8f ce 15 be 22 19 c6 cd 95 02 41 d9 db 08 36".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("2d b0 c7 5a 59 f5 52 75 84 b2 92 4a 32 99 5f 62".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("25 8d 41 0b 8f cf 29 b7 c8 40 5a e9 95 60 d4 3a".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("ee af ec 9d 7d 49 10 9a 08 d5 d3 6f 26 e5 f9 48".replace(" ", ""))
                        .unwrap(),
                ),
                ProtoData::Bytes(
                    hex::decode("7a a3 1e 3a 68 c0 ea 5c f1 97 a9 61 3a 68 de 46".replace(" ", ""))
                        .unwrap(),
                ),
            ]),
        );

        assert_eq!(pb, Message(expect_pb));
    }

    fn read_protobuf(hex_str: &str) -> anyhow::Result<ProtoData> {
        let bytes = hex::decode(hex_str.replace(" ", ""))?;
        decode_protobuf(&mut Reader::new(&bytes.as_slice()))
    }

    #[test]
    fn fixint() {
        let nums: Vec<i64> = vec![-100, -10, 0, 10, 100];
        for &num in &nums {
            let data = fixint::encode_fix64(num);
            assert_eq!(
                num,
                fixint::read_fix64(&mut Reader::new(data.as_slice())).unwrap()
            )
        }

        for &num in &nums {
            let data = fixint::encode_fix32(num as i32);
            assert_eq!(
                num as i32,
                fixint::read_fix32(&mut Reader::new(data.as_slice())).unwrap()
            )
        }
    }

    #[test]
    fn uvarint() {
        let nums: Vec<u64> = vec![0, 10, 1000, 10000, 123456, 128, 256, 512];
        for num in nums {
            let data = varint::encode_uvarint(num);
            assert_eq!(
                num,
                varint::read_uvarint(&mut Reader::new(data.as_slice())).unwrap()
            );
        }

        let data: Vec<u8> = vec![192, 196, 7];
        assert_eq!(
            123456,
            varint::read_uvarint(&mut Reader::new(data.as_slice())).unwrap()
        );

        let data: Vec<u8> = vec![192, 196, 7, 1, 1, 1, 1, 1, 1, 1, 1];
        assert_eq!(
            123456,
            varint::read_uvarint(&mut Reader::new(data.as_slice())).unwrap()
        );
    }

    #[test]
    fn varint() {
        let nums: Vec<i64> = vec![
            0, 10, 1000, 10000, 128, 256, 512, -10, -1000, -10000, -128, -256, -512,
        ];
        for num in nums {
            let data = varint::encode_varint(num);
            assert_eq!(
                num,
                varint::read_varint(&mut Reader::new(data.as_slice())).unwrap()
            );
        }
    }
}