练习:Protobuf 解析
在本练习中,您将为 protobuf 二进制编码 构建一个解析器。别担心,其实非常简单!这展示了一种常见的解析模式,即传递数据 slice。底层数据本身永远不会被复制。
如要完整解析 protobuf 消息,需要知道字段的类型(按字段编号编入索引)。这通常会在 proto
文件中提供。在本练习中,我们将把这些信息编码成处理每个字段所调用的函数中的 match
语句。
我们将使用以下 proto:
message PhoneNumber {
optional string number = 1;
optional string type = 2;
}
message Person {
optional string name = 1;
optional int32 id = 2;
repeated PhoneNumber phones = 3;
}
proto 消息被编码为连续的一系列字段。每个字段都通过 “标签”后面紧跟值的形式来实现。标签包含一个字段编号(例如Person
消息的 id
字段的值为 2
)和线型(用于定义应如何从字节流确定载荷)。
整数(包括标签)使用名为 VARINT 的可变长度编码表示。幸运的是,下面为您提供了 parse_varint
的定义。该指定代码还定义了一些回调,用于处理 Person
和 PhoneNumber
字段,并将消息解析为对这些回调的一系列调用。
What remains for you is to implement the parse_field
function and the ProtoMessage
trait for Person
and PhoneNumber
.