S-JIS[2024-09-28] 変更履歴

prost 構造体

Rustprostで生成される構造体のメモ。


概要

protoファイルで定義されているmessageは、prost-buildによってRustの構造体に変換される。
この構造体は、::prost::Messageトレイトが実装されている。


Snazzyの例。

items.proto:(抜粋)

// A snazzy new shirt!
message Shirt {
  enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
  }

  string color = 1;
  Size size = 2;
}

prost-buildによる変換

snazzy.items.rs:(抜粋)

/// 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(
  &mut self,
  tag: u32,
  wire_type: WireType,
  buf: &mut impl Buf,
  ctx: DecodeContext,
) -> Result<(), DecodeError>
   
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);
s.encode(&mut buf)?;
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);
s.encode_length_delimited(&mut buf)?;
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のフィールドになる。
これを列挙型として扱うセッター/ゲッターメソッドが生成される。


prostへ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま