非常に原始的な形式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
ヘルパー関数がを返すことができるようにしたいのEither
ですが、それをどのように取得できるかわからず、アクションリストの評価を終了する機能もありますbuildSeq
。
ここに私が見る唯一の選択があります
1)exceptionHandler
ハンドラーにあることを確認してください。置きJobMap
にApp
記録。例外の詳細getYesod
をJobMap
示すために適切な値を変更することを使用して、次にアクセスできますfoo
もっと良い方法はありますか?
私の他の選択肢は何ですか?
編集:明確にするために、の役割を説明しHandler RepJson
ます。サーバーは、などのコマンドを受け入れる何らかの方法を必要としますbuild
stop
report
。クライアントはこれらのコマンドの結果を知る何らかの方法を必要とします。サーバーとクライアントが相互に通信する媒体としてJSONを選択しました。私はハンドラータイプを使用して、JSONの入出力のみを管理しています。