ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

rusoto が async/.await 対応したのをきっかけにさわってみた雑感

タイムラインに ↓ が流れてきたのでこれはやらねば async/.await 対応 してみての雑感です。

雑感

  • 感触はよさげ。.await?Result 型もむけたりする
  • .await 忘れが罠臭い。コンパイルできるし起動できるがスルーされる
  • Option::unwap_or_else とかがちょっとつらそう? 回避はできるし、まだわかりきってない可能性あり
  • Stream trait の実装はあきらめた。Pin とか Unpin とか Poll をわかってないと分かったのでいつか再チャレンジ

Stream を crate でどうにかしてもらった

Kinesis Stream って名前である以上どうしても Stream にしたかったので、調べたら async-stream を見つけられました。
実際には以下のよう使いました。

    pub fn stream(mut self) -> impl Stream<Item = Result<GetRecordsOutput, Error>> {
        try_stream! {
            loop {
                if let Some(current) = &self.token {
                    let r = self.get_records(current).await?;
                    self.token = r.next_shard_iterator.clone();
                    yield r;
                } else {
                    let next = self.get_iterator_token().await?;
                    self.token = Some(next);
                    continue;
                }
            }
        }
    }

k-iter/kinesis.rs at 94c79facb6e2459eedf3ce85a40dab034007f129 · ROki1988/k-iter · GitHub

私がつかめてない Streamasync/.await の関係性のところにするっと入ってくれました。
個人的には前よりもすっきりした印象を持ってます。

つづく

まだ 0.43.0-beta.1 なので注視しつつ、折を見て master に merge してきます。
ここ最近コード書いてなくてさび付いてるかなーとおもったんすが、まだ何とかなってました。
何とかなるぐらい Rust のコンパイルエラーとか fmt とか clippy が優秀ってのもある。ありがたし。