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łbymfoo
s 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.