Servant
servant, servant-server
symbolVal: Proxy から文字列を取り出す (すごいね…)
よくわからんところ
Servant のレイヤとその後ろのレイヤを完全に分離したいとき
エラーハンドリング
普通にやると、Servant の Handler モナドを常に使って、なにかエラーになったら monadThrow err500 みたいなことをする
だけど、Servant の事情を裏側まで伝搬させたくない。分離したい。
そうなると、ServerError とは別の例外を IO に向けて投げることになる
ExceptT とか別途使ってもいいけど、どうやら最近の Haskell は unliftio のやつとかを使うのがいいらしい
そして Servant のレイヤのところで、その例外をキャッチして ServerError として投げ直す必要がある
だが、キャッチするためには Handler を MonadUnliftIO のインスタンスにする必要があり、その方法がわからん
Handler a -> IO a を作る必要があるが、そうすると ExceptT を剥がす必要がある
RIO env a を Handler a に直接するのではなく、IO a に一旦してから try して Handler a に包み直せばいい説
うーん、って感じがするけどしょうがないんかな
ハンドラを書くときは別のモジュールにする、かつその中で ServerError を投げたいこともあるので、最後に変換するのではなく、ハンドラ内で runRIO する必要があるかもしれん
くそめんどい
Handler の実行に env を渡す必要があってめんどい
パフォーマンスはどちらにしろ一度だけ runRIO が走るので問題ない?
嘘。普通にたくさん runRIO するかも。
しょうがない?
Handler a が RIO env a になれば全部解決するのに
type App a = LoggingT (ExceptT AppError Handler) a みたいにするのが一番いいのかもしれない
完全に分離、無理なのか?
全部 RIO env a でやっちゃう説
ServerError も、RIO env a の中で投げてしまう。どうせ Exception クラスだし。
これを最後に catch して、ExceptT の中に詰める
トリッキーだけど、なくはない、かも
ログ
monad-logger か