Несомненный плюс пет-проектов в том, что там не обязательно следовать всем правилам расширяемого кода и можно захардкодить решения. Мне не подошёл опенсорсный protoc плагин к mongo, так как требовал указания аннотаций, поэтому я написал свой.
Проект у меня на go, и так как grpc интерфейсы получаются кодгеном через официальный плагин, есть и плагин под кастомный код, где можно работать уже со структурами прото и не надо парсить файлы.
Но есть и особенности, например нет многих хелперов (или я плохо искал), поэтому например proto сообщение для map я ищу в файле просто двумя циклами (даже не рекурсией), так как у меня нет вложенных message (первая картинка).
Для шаблонов использовал классический text/template, на второй картинке результат кодогенерации, на третьей кусок шаблона для этого кода.
Это написал я на прошлых выходных, потому что стало много grpc сервисов и надоело перекладывать руками. Могу сказать, что писать плагины для прото таким способом совсем несложно, особенно под себя. У меня например шарятся enum, убираются указатели кроме optional полей и перекладывается поле id для монговского _id. По итогу просто вызываю метод ToProto() и радуюсь жизни.
Наверно в каком-нибудь zig (или даже rust с его макросами) это всё удобнее. Но так как писать кодген очень быстро, текущее решение мне вполне подходит. Хотя потом там особенности возникают на стыке кодгена и дженериков (ограничения на параметры дженериков элегантно не написать, нужно догенерить небольшую функцию обёртку, которая через аргументы делает switch case).
Post #596
745



- 👍 4
- 👏 1