非常にプリミティブな形式のipc
(telnetを使用して特定の順序で特定の単語を含むStringを送信するデーモン)を作成しました。私はそれから抜け出し、今JSON
を使ってYesod
サーバにメッセージを渡しています。しかし、私のデザインについて本当に好きなことがいくつかありましたが、今私の選択肢が何であるか分かりません。Yesodの例外
は、ここで私は何をやっていたのです。
buildManager :: Phase -> IO()
buildManager phase = do
let buildSeq = findSeq phase
jid = JobID $ pack "8"
config = MkConfig $ Just jid
flip C.catch exceptionHandler $
runReaderT (sequence_ $ buildSeq <*> stages) config
-- ^^ I would really like to keep the above line of code, or something like it.
return()
各機能buildSeqにこの
foo :: Stage -> ReaderT Config IO()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
のように見えた現在のジョブに関する情報を追跡するTMVar Map
です。すべてはこの
foo :: Handler RepJson
foo
のように見える私のデーモンのコマンドを表していること
は今、私が持っているもの、ハンドラされ、各ハンドラは異なるJSONオブジェクトを処理する必要があります。
私がしたいのは、成功を表すオブジェクトJSON
と、例外に関する情報をエスケープする別のJSONオブジェクトです。
私はEither
を返すことができるようにfoo
のヘルパー関数をしたいと思いますが、私はそれを得るかどうかはわかりません、プラスアクション、buildSeq
の私のリストの評価を終了する機能。
は、ここで私は
1)exceptionHandler
がハンドラであることを確認してくださいを参照してください唯一の選択肢です。 App
レコードにJobMap
を入れてください。 getYesod
その後foo
良い方法はありますがアクセスすることができる例外の詳細を示すJobMap
に適切な値、 を変更使用していますか?
私の他の選択肢は何ですか?
編集:わかりやすくするために、私はHandler RepJson
の役割について説明します。サーバーは、build
stop
report
のようなコマンドを受け入れるために何らかの方法を必要とします。クライアントは、これらのコマンドの結果を知るための何らかの方法を必要とします。私は、サーバーとクライアントが互いに通信するメディアとしてJSONを選択しました。私はHandler型を使ってJSONの入出力を管理しています。
あなたの洞察力をお寄せいただきありがとうございます、Tyler Durden –