2016-10-05 62 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服務代碼。查看每種語言中生成的代碼的文檔以找出它們提供的插入點。

您的插件必須檢查您的自定義選項的值併爲字段生成額外的驗證碼。