Excepciones en Yesod
Había hecho un demonio que usaba una forma muy primitiva deipc
(Telnet y enviar una cadena que tenía ciertas palabras en un cierto orden). Salí de él y ahora estoy usandoJSON
pasar mensajes a unYesod
servidor. Sin embargo, hubo algunas cosas que realmente me gustaron de mi diseño, y no estoy seguro de cuáles son mis opciones ahora.
Esto es lo que estaba haciendo:
<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>
cada función en buildSeq se veía así
<code>foo :: Stage -> ReaderT Config IO () data Config = MkConfig (Either JobID Product) BaseDir JobMap </code>
JobMap
es unTMVar Map
que rastrea información sobre trabajos actuales.
así que ahora, lo que tengo son manejadores, que todos se ven así
<code>foo :: Handler RepJson </code>
foo
representa un comando para mi demonio, cada controlador puede tener que procesar un objeto JSON diferente.
Lo que me gustaría hacer es enviar uno.JSON
objeto que representa el éxito y otro objeto JSON que expresa información sobre alguna excepción.
Me gustaríafoo
s función de ayuda para poder devolver unaEither
, pero no estoy seguro de cómo obtengo eso, más la capacidad de terminar la evaluación de mi lista de acciones,buildSeq
.
Aquí está la única opción que veo
1) asegurarseexceptionHandler
Está en Handler. PonerJobMap
en elApp
grabar. UtilizandogetYesod
alterar el valor apropiado enJobMap
indicando detalles sobre la excepción, a la que luego se puede acceder porfoo
¿Hay alguna manera mejor?
¿Cuáles son mis otras opciones?
Edit: Para mayor claridad, explicaré el papel deHandler RepJson
. El servidor necesita alguna forma de aceptar comandos comobuild
stop
report
. El cliente necesita alguna forma de conocer los resultados de estos comandos. He elegido JSON como el medio con el que el servidor y el cliente se comunican entre sí. Estoy usando el tipo Handler solo para administrar el JSON in / out y nada más.