私は非常に原始的な形式のipc
(telnet を使用し、特定の単語を特定の順序で含む文字列を送信する) デーモンを作成しました。私はそれから抜け出し、現在はJSON
メッセージを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
、成功を表す 1 つのオブジェクトと、何らかの例外に関する情報を伝える別の JSON オブジェクトを送信することです。
foo
s ヘルパー関数が を返せるようにしたいのEither
ですが、それを取得する方法がわかりません。さらに、アクション リストの評価を終了する機能buildSeq
.
ここに私が見る唯一の選択肢があります
1) exceptionHandler
Handler にあることを確認します。JobMap
記録に入れApp
ます。例外に関する詳細getYesod
を示すために適切な値を変更します。JobMap
foo
より良い方法はありますか?
私の他の選択肢は何ですか?
編集:わかりやすくするために、の役割を説明しHandler RepJson
ます。サーバーには、 などのコマンドを受け入れる何らかの方法が必要build
stop
report
です。クライアントは、これらのコマンドの結果を知る何らかの方法を必要とします。サーバーとクライアントが相互に通信するための媒体として、JSON を選択しました。JSON のイン/アウトを管理するためだけに Handler タイプを使用しています。