Ранее я спросил How can I include an arbitrary set of Protobuf-built files without knowing their names? - это следующий вопрос, основанный на результатах этого.Как определить сообщения в файлах .rs, созданных из ржавчины-protobuf, включенных в include! макрос
теперь у меня есть файл, который я включаю, который содержит различные модули на их собственной линии - то есть:
mod foo;
mod bar;
Эти модули и их имена могут быть совершенно случайным образом в зависимости от того, что пользователь поставил в каталог для прото-файлов.
Мне нужно выполнить операции над этими случайными модулями. Например, первое, что я хотел бы сделать, это получить все сообщения, которые существуют в этих новых модулях, и представить их в виде строк, которые я могу нажать на вектор.
Так действительно 2 часть вопроса:
- Есть ли способ, я не могу знать имена модулей, которые я сейчас в том числе и в этом файле с включают в себя! и используйте структуры внутри них (в общем - теперь, когда я их включил).
- После вышесказанного, как получить все возможные сообщения внутри созданного protobuf файла .rs/module. Каждый файл .rs имеет
FileDescriptorProto()
метод, который смотрит на документации Protobuf Google, выглядит примерно так: Google Protobuf FileDescriptor
Я не думаю, что вы можете. По сути, вы просите о рефлексии, которая не совсем существует в том смысле, в котором вы нуждаетесь. В качестве примера рассмотрим атрибут '# [test]', который в основном делает то же самое, что вы хотите - он собирает все аннотированные функции и вызывает их. Это реализовано как дополнение к самому компилятору, а не технику, доступную большинству программистов. Вместо этого рассмотрите возможность расширения инструмента преобразования файлов, чтобы создать хорошо известный и необходимый символ, который всегда можно доверять, чтобы быть там. – Shepmaster
Что делать, если я требовал, чтобы файл прототипа верхнего уровня выполнял «import .proto» (в фактическом файле .proto) для всех других прото-файлов. Если бы я это сделал, могу ли я включить этот верхний уровень.rs-файл (который будет скомпилирован), а затем использовать метод, который возвращает FileDescriptorProto для получения других протоструктур? Возможно, я не совсем понимаю, как работает метод FileDescriptorProto() ... –