Можно ли включить векторные поля в сообщение protobuf для создания структуры Rust? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть файл 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 или нет? Если да, как я могу это сделать?

1 Ответ

1 голос
/ 18 июня 2019

Вы можете использовать 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 здесь), показывают, что он имеет то, что мы ожидаем от векторов: доступ по индексу и итераторы.Ваш сгенерированный код также будет иметь доступ по индексу и добавлять / удалять последние методы.

...