是否可以在protobuf消息中包含向量字段以生成Rust结构?

时间:2019-04-19 09:12:42

标签: vector rust protocol-buffers proto3

我有一个protobuf文件,用于在项目中生成类型。其中一种类型如下:

syntax = "proto3";

// ...

message myStruct {
    int32 obj_id = 1;
    string obj_code = 2;
    string obj_name = 3;
    // ... some more fields
}
// ... some more message, enum, etc ....

然后,我可以启动一个微型脚本,该脚本通过protoc-gen-go生成一些Go代码,然后通过使用protoc-gen-rust的另一个脚本将其翻译为Rust。

结果是一个Rust文件,看起来像:

// This file is generated by rust-protobuf 2.0.0. Do not edit
// @generated

// ...

pub struct myStruct {
    // message fields
    pub obj_id: i32,
    pub obj_code: ::std::string::String,
    pub obj_name: ::std::string::String,
    // ... some more fields
}
impl myStruct {
    // ... lots of constructors, getters, setters, etc
}

我不希望有更好的方法来完全生成Rust类型,该项目非常庞大,并且在生产中,我的工作不是重写/重组它,而只是添加一些功能,为此我需要一些帮助在两个结构中添加标志的向量。

我想在Vec结构中添加一些myStruct字段,例如:

pub struct myClass {
    // ... some fields like obj_id etc ...

    // the fields I want to add
    bool_vec: Vec<bool>,
    bool_vec_vec: Vec<Vec<bool>>,
    // ...
}

是否可以使用原始buf来做到这一点?如果是,该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以使用protobuf repeated fields

  

repeated:在格式正确的邮件中,此字段可以重复任意次(包括零次)。重复值的顺序将保留。

赞:

message bool_vec{
    repeated bool element = 1;
}
message bool_vec_vec{
    repeated bool_vec element = 1;
}
message myStruct {
    ...
    bool_vec v = 100;
    bool_vec_vec vv = 101;
    ...
}

protobuf C ++库中的documentation of RepeatedField(在这里代表重复的字段,例如重复的bool)表明它具有我们对向量的期望:通过索引和迭代器进行访问。您生成的代码还将可以按索引访问,并添加/删除最后一个方法。