protoファイルで定義されているmessageは、prost-buildによってRustの構造体に変換される。
この構造体は、::prost::Message
トレイトが実装されている。
Snazzyの例。
// A snazzy new shirt! message Shirt { enum Size { SMALL = 0; MEDIUM = 1; LARGE = 2; } string color = 1; Size size = 2; }
↓prost-buildによる変換
/// A snazzy new shirt! #[derive(Clone, PartialEq, ::prost::Message)] pub struct Shirt { #[prost(string, tag = "1")] pub color: ::prost::alloc::string::String, #[prost(enumeration = "shirt::Size", tag = "2")] pub size: i32, }
let s = Shirt { color: ProstString::from("abc"), size: Size::Large.into(), }; println!("Shirt = {:?}", s);
prost-buildでは、構造体に対するメソッドや関数は生成されない。
しかし生成された構造体はprostのMessageトレイトを実装しているので、Messageトレイト由来のメソッドが使用できる。
use prost::{bytes::BytesMut, Message};
以下の例ではBytesMutを使っているが、これはBufMutとBufを実装している。
メソッド | 説明 | 例 |
---|---|---|
encode_raw(&self,
buf: &mut impl BufMut) |
||
merge_field( |
||
encoded_len(&self)
-> usize |
メッセージのバイト数を返す。 | let len = s.encoded_len(); |
encode(&self, buf:
&mut impl BufMut) -> Result<(), EncodeError> |
メッセージのバイト列をBufMutに追加する。 | let mut buf = BytesMut::with_capacity(128); |
encode_to_vec(&self)
-> Vec<u8> |
メッセージのバイト列をVec<u8>で返す。 | let vec = s.encode_to_vec(); |
encode_length_delimited(&self, buf: &mut impl BufMut) ->
Result<(), EncodeError> |
メッセージの長さを含めたバイト列をBufMutに追加する。 | let mut buf = BytesMut::with_capacity(128); |
encode_length_delimited_to_vec(&self) -> Vec<u8> |
メッセージの長さを含めたバイト列をVec<u8>で返す。 | let vec = s.encode_length_delimited_to_vec(); |
decode(mut buf: impl
Buf) -> Result<Self, DecodeError> |
メッセージのバイト列から構造体を復元する。 | let d = Shirt::decode(buf)?; |
decode_length_delimited(buf: impl Buf) -> Result<Self,
DecodeError> |
メッセージの長さを含めたバイト列から構造体を復元する。 | let d = Shirt::decode_length_delimited(buf)?; |
merge(&mut self, mut
buf: impl Buf) -> Result<(), DecodeError> |
||
merge_length_delimited(&mut self, mut buf: impl Buf) ->
Result<(), DecodeError> |
||
列挙型フィールド名(&self) -> 列挙型 |
フィールドから列挙型として取得する。 | let size = s.size(); |
set_列挙型フィールド名(&mut self, 列挙型) |
列挙型を受け取ってフィールドにセットする。 | s.set_size(Size::Medium); |
protobufのmessageがenumを持っている場合、生成された構造体ではi32のフィールドになる。
これを列挙型として扱うセッター/ゲッターメソッドが生成される。