#protocol-buffers

protobuf_codec

基于bytecodec crate实现的Protocol Buffers编码器和解码器

12个版本

0.2.8 2019年10月6日
0.2.7 2019年5月18日
0.2.6 2018年10月17日
0.2.4 2018年5月28日
0.1.2 2018年5月15日

#1458 in 编码

Download history 70/week @ 2023-10-29 62/week @ 2023-11-05 64/week @ 2023-11-12 65/week @ 2023-11-19 82/week @ 2023-11-26 55/week @ 2023-12-03 49/week @ 2023-12-10 52/week @ 2023-12-17 84/week @ 2023-12-24 27/week @ 2023-12-31 50/week @ 2024-01-07 43/week @ 2024-01-14 45/week @ 2024-01-21 47/week @ 2024-01-28 48/week @ 2024-02-04 68/week @ 2024-02-11

210 每月下载量
10 crate 中使用 (直接使用 6 个)

MIT 许可证

150KB
4K SLoC

protobuf_codec

protobuf_codec Documentation Build Status Code Coverage License: MIT

基于 bytecodec crate 的 Protocol Buffers 编码器和解码器的Rust实现。

文档

示例

一个用于在语言指南中定义的 SearchRequest 消息的编码器/解码器。

extern crate bytecodec;
extern crate protobuf_codec;

use bytecodec::EncodeExt;
use bytecodec::io::{IoDecodeExt, IoEncodeExt};
use protobuf_codec::field::{Fields, FieldDecoder, FieldEncoder, MaybeDefault};
use protobuf_codec::field::num::{F1, F2, F3};
use protobuf_codec::message::{MessageDecoder, MessageEncoder};
use protobuf_codec::scalar::{Int32Decoder, Int32Encoder, StringDecoder, StringEncoder};

// syntax = "proto3";
//
// message SearchRequest {
//   string query = 1;
//   int32 page_number = 2;
//   int32 result_per_page = 3;
// }
type SearchRequestEncoder = MessageEncoder<
    Fields<(
        MaybeDefault<FieldEncoder<F1, StringEncoder>>,
        MaybeDefault<FieldEncoder<F2, Int32Encoder>>,
        MaybeDefault<FieldEncoder<F3, Int32Encoder>>,
    )>,
>;
type SearchRequestDecoder = MessageDecoder<
    Fields<(
        MaybeDefault<FieldDecoder<F1, StringDecoder>>,
        MaybeDefault<FieldDecoder<F2, Int32Decoder>>,
        MaybeDefault<FieldDecoder<F3, Int32Decoder>>,
    )>,
>;

fn main() {
    let mut buf = Vec::new();
    let mut encoder = SearchRequestEncoder::with_item(("foo".to_owned(), 3, 10)).unwrap();
    encoder.encode_all(&mut buf).unwrap();
    assert_eq!(buf, [10, 3, 102, 111, 111, 16, 3, 24, 10]);

    let mut decoder = SearchRequestDecoder::default();
    let message = decoder.decode_exact(&buf[..]).unwrap();
    assert_eq!(message, ("foo".to_owned(), 3, 10));
}

参考

依赖

~1.5MB
~40K SLoC