2016-10-05 58 views
4

我已经使用Protobuf3定义PB信息字符串验证:Protobuf3:与正则表达式

syntax = "proto3"; 
package vioozer_protobuf; 

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

在我的系统,传感器具有唯一的ID的格式(一拉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服务代码。查看每种语言中生成的代码的文档以找出它们提供的插入点。

您的插件必须检查您的自定义选项的值并为字段生成额外的验证码。