2016-10-05 2 views
4

Я использую Protobuf3 определить сообщение PB:Protobuf3: String проверки с регулярным выражением

syntax = "proto3"; 
package vioozer_protobuf; 

message Update 
{ 
    string sensor_id = 1; 
    ... 
} 

В моей системе, датчики имеют уникальный формат идентификатор (а-ля SENSOR-1342r43), которые могут быть легко проверены с регулярное выражение.

Есть ли способ добавить валидатор регулярных выражений в поле protobuf, так что в это поле будут приняты только строки, которые присоединяются к регулярному выражению?

+0

Помогает ли это: [go-proto-validators] (https://github.com/mwitkow/go-proto-validators)? –

+0

Спасибо! Тем не менее, я ищу решение внутри языка, а не внешний плагин. –

+1

У меня тогда нет ни одной подсказки ... Но из моего небольшого опыта, если кто-то создал внешний плагин, это то, что он отсутствовал на языке –

ответ

5

Protobuf не поддерживает проверку сообщений из коробки, но его можно добавить с помощью плагина (это единственный способ, однако, это не так просто).

Вы можете попробовать найти существующий плагин или создать свой собственный (если для вашего языка нет существующего плагина).

Если вы решили написать свой собственный плагин, то первый шаг заключается в определении a custom option для полей:

package yourcompany; 

import "google/protobuf/descriptor.proto"; 

extend google.protobuf.FieldOptions { 
    optional string validator = 51234; 
} 

Эта опция позволяет задать регулярное выражение для конкретной области. Затем применить новый пользовательский вариант:

message Update { 
    string sensor_id = 1 [(yourcompany.validator) = "SENSOR-???????"]; 
    // ... 
} 

Во-вторых, и более сложный шаг заключается в write your own plugin для того, чтобы добавить логику проверки в генерируемый код:

Кроме того, модули способны вставить код в блок файлы, созданные другими генераторами кода. См. Комментарии по поводу «точек ввода» в plugin.proto для получения дополнительной информации об этом. Это может быть использовано, например, для написания плагина, который генерирует код службы RPC, который предназначен для конкретной системы RPC. См. Документацию для сгенерированного кода на каждом языке, чтобы узнать, какие точки ввода они предоставляют.

Ваш плагин должен проверить значение вашей настраиваемой опции и сгенерировать дополнительный код проверки для полей.

Смежные вопросы