• 作成:

ActixのHandlerのhandleメソッドでFutureを返却して送信元のActorで実行する

actix/actix: Actor framework for RustHandlerからFutureを返そうとして失敗し続けて何もわからん… ってなってました.

ハマったポイントはロジックのResultErrFutureErrは別だと思っていたところです.

そこは同一なので, ResponseFutureの第2型引数にはエラーを単独で渡す必要があります.

ハマり続けていた原因はslack_hook::Resultを使っていたため, エラーが単独で見づらかったところにもあるでしょう.

まずメッセージを定義します.

#[derive(Debug, Message)]
#[rtype(result = "slack_hook::Result<()>")]
pub struct Start;

この時メッセージのresultResultになっていても

impl Handler<Start> for Foo {
    type Result = ResponseFuture<slack_hook::Result<()>, Error>;
}

のようにしてはいけません. 正解は

impl Handler<Start> for Foo {
    type Result = ResponseFuture<(), slack_hook::Error>;
}

です.

Futureが失敗する理由にロジック以外の外的要因などがあると思い込んでいたのが敗因です. 思えばstd::futureは失敗しない関数向けにResultじゃないバージョンを提供する予定なのですから別なのは当たり前ですね.

これでメッセージの送信元がFutureを手に入れることが出来て, ctx.spawnを使って起動して送信元でエラーハンドリングすることが可能になります.

ハンドラの受信側が起動するよりメリットがあります.