Можно ли включать векторные поля в сообщение protobuf для создания структуры Rust?

У меня есть файл 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 ....

Затем я могу запустить крошечный скрипт, который генерирует код Go через protoc-gen-go, который позже переводится в Rust через другой скрипт с использованием protoc-gen-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>>,
    // ...
}

Можно ли это сделать с помощью proto-buf или нет? Если да, то как я могу это сделать?


person m.raynal    schedule 19.04.2019    source источник


Ответы (1)


Вы можете использовать повторяющиеся поля protobuf:

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;
    ...
}

документация RepeatedField из Библиотека protobuf C++ (которая представляет повторяющиеся поля, такие как повторяющееся bool здесь) показывает, что она имеет то, что мы ожидаем от векторов: доступ по индексу и итераторам. Ваш сгенерированный код также будет иметь доступ по индексу и добавлять/удалять последние методы.

person galka    schedule 18.06.2019