2012-04-12 33 views
93

非常にプリミティブな形式の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の役割について説明します。サーバーは、buildstopreportのようなコマンドを受け入れるために何らかの方法を必要とします。クライアントは、これらのコマンドの結果を知るための何らかの方法を必要とします。私は、サーバーとクライアントが互いに通信するメディアとしてJSONを選択しました。私はHandler型を使ってJSONの入出力を管理しています。

答えて

9

哲学的に言えば、Haskell/Yesodの世界では、値を後方に返すのではなく、前方に渡したいと考えています。そのため、ハンドラに値を返させる代わりに、プロセスの次のステップに進むようにコールするようにしてください。例外を生成する可能性があります。

今後のアクションを1つのオブジェクトにまとめることができるので、ハンドラとフォーズに継続オブジェクトを渡すことができるので、基本的には「完了後にこのコードを実行してください。そうすれば、彼らは無効になり、何も返されません。

+0

あなたの洞察力をお寄せいただきありがとうございます、Tyler Durden –