Для начала надо понять какими сущностями оперирует гугловский компилятор, и работать с тем, что ему ближе.
Основные сущности примерно такие:
- Сообщение (message) — главная сущность, по своей сути структура с геттерами/сеттерами, методами для выставления дефолтных значений, сериализации и десериализации, проверками на наличие полей в сообщении, операторами присваивания и т.д. В не-lite режиме сообщения могут предоставлять метаданные (reflection) о себе.
- Пространства имён (namespace) — понятно, что такое. Пространства имён могут быть вложенные (как и объявление сообщений). Fpc штатно не содержит поддержку пространств имён, но т.к. в protobuf'е они есть, нужно придумать способ их сэмулировать, иначе есть опасность столкнуться с конфликтом имён. Я планирую использовать для этих целей классы (или объекты): классы могут быть вложенными, Global.Local.Message будет смотреться весьма аккуратно и логично, а конструкция вида with Namespace.Subnamespace do прекрасно заменит локальный using namespace из Си.
- Объявление enum-типа — будет сделано через enum'ы паскаля (или просто через константы), проблем тут быть не должно.
- Массивы (repeated поля сообщений) — поля, хранящие несколько значений, с random access по индексу и возможностью добавления новых значений. Их логично реализовать через динамический массив, хотя вариант через список не кажется плохим, т.к. random access'ы не всегда нужны, а умение быстро добавить новый элемент в конец и проитерировать все значения — всегда. Дизайн интерфейса нужно ещё обдумывать (думаю, что нужно писать дженерик TProtobufArray<TProtobufMessage>, в нём определять нужные методы и реализовывать енумератор. Ожидаю встретить многочисленные подводные камни.).