Wyjątki w Yesod

Stworzyłem demona, który używał bardzo prymitywnej formyipc (telnet i wyślij ciąg, który zawierał pewne słowa w określonej kolejności). Wyłamałem się z tego i teraz używamJSON przekazywać wiadomości do aYesod serwer. Jednak w moim projekcie było kilka rzeczy, które bardzo mi się podobały i nie jestem pewien, jakie mam teraz wybory.

Oto co robiłem:

<code>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 ()
</code>

każda funkcja w buildSeq wyglądała tak

<code>foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap
</code>

JobMap jestTMVar Map śledzi informacje o bieżących zadaniach.

więc teraz mam to Handlers, które wyglądają tak

<code>foo :: Handler RepJson
</code>

foo reprezentuje polecenie dla mojego demona, każdy program obsługi może wymagać przetworzenia innego obiektu JSON.

Chciałbym wysłać jedenJSON obiekt reprezentujący sukces i inny obiekt JSON, który wyraża informacje o jakimś wyjątku.

chciałbymfoos funkcja pomocnicza, aby móc zwrócićEither, ale nie jestem pewien, jak to uzyskać, a także możliwość zakończenia oceny mojej listy działań,buildSeq.

Oto jedyny wybór, jaki widzę

1) upewnij sięexceptionHandler jest w Handler. PołożyćJobMap wApp rekord. Za pomocągetYesod zmień odpowiednią wartość wJobMap wskazując szczegóły wyjątku, do którego można uzyskać dostępfoo

Czy jest lepszy sposób?

Jakie mam inne możliwości?

Edytuj: Dla jasności wyjaśnię rolęHandler RepJson. Serwer potrzebuje jakiegoś sposobu na zaakceptowanie poleceń takich jakbuild stop report. Klient potrzebuje jakiegoś sposobu poznania wyników tych poleceń. Wybrałem JSON jako medium, z którym serwer i klient komunikują się ze sobą. Używam typu Handler tylko do zarządzania wejściem / wyjściem JSON i niczym więcej.

questionAnswers(1)

yourAnswerToTheQuestion