Пакет позволяет редактировать message proto с помощью extension. Как это работает:
- Создаем message proto аля example.proto.
- Создаём extension message аля sensitive.proto. Если нужно работать с мапами, то добавляем поле с типом repeated string в нашем extension message (типа такого repeated string map_keys_to_redact = 1;). В нём мы будем хранить поля, с которыми надо будет работать в мапе. Т.к. мы сами задаём это поле, то мы всегда знаем, что сгенерирует protoc (в .pb.go файле будет присутствовать метод, который нам нужен для работы с мапой, он будет иметь вид Get + название поля в camelCase, в нашем случае это будет GetMapKeysToRedact).
- Добавляем extension к message proto:
- Добавляем import "sensitive.proto";
- У полей, которые мы хотим редактировать, добавляем
[(sensitive) = {}]. Если это мапа и мы хотим редактировать конкретные ключи, то добавляем[(sensitive) = {map_keys_to_redact:["phone", "email"]}], т.е. перечисляем поля, которые надо редактировать.
- Генерируем .go файлы с помощью protoc.
- В sensitive.pb.go мы можем найти переменную, которая будет начинаться с E_ + название нашего extension message в camelCase. В нашем случае это E_Sensitive. Эту переменную надо передать в редактор, чтобы он смог определять, какие поля надо редактировать. Так же в этом файле мы можем найти функцию, определение которой нам надо передать в редактор, если мы хотим работать с мапой. Т.к. в нашем случае это GetMapKeysToRedact, то мы на основе неё можем собрать функцию, которая будет удовлетворять типу FieldsFromMapFunc и возвращать список ключей для редактирования мапы. Пример можно посмотреть в functions.go в функции CommonFieldsFromMapFunc.
- Создаём редактор redactor.go через NewRedactor, в который передаём E_Sensitive и опции для редактирования. Есть уже готовый вариант редактора, который удаляет все помеченные поля - NewCleanRedactor.
- У редактора есть два метода:
- Redact - редактирует само сообщение.
- RedactClone - редактирует копию сообщения и возвращает её.
- Пример использования можно посмотреть в redactor_test.go.