Había creado un demonio que usaba una forma muy primitiva de ipc
(telnet y enviar una cadena que tenía ciertas palabras en un orden determinado). Salí de él y ahora lo estoy usando JSON
para pasar mensajes a un Yesod
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:
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 ()
cada función en buildSeq se veía así
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
es un TMVar Map
que rastrea información sobre trabajos actuales.
así que ahora, lo que tengo son controladores, que todos se ven así
foo :: Handler RepJson
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 un JSON
objeto que represente el éxito y otro objeto JSON que exprese información sobre alguna excepción.
Me gustaría foo
s función auxiliar para poder devolver una Either
, pero no estoy seguro de cómo consigo que, además de la posibilidad de suspender la evaluación de mi lista de acciones, buildSeq
.
Esta es la única opción que veo
1) asegúrese de que exceptionHandler
esté en Handler. Ponga JobMap
el App
registro. El uso de getYesod
alterar el valor apropiado para JobMap
indicar detalles sobre la excepción, a la que luego se puede acceder mediantefoo
¿Existe una forma mejor?
¿Cuáles son mis otras opciones?
Editar: Para mayor claridad, explicaré el papel de Handler RepJson
. El servidor necesita alguna forma de aceptar comandos como build
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 JSON in / out y nada más.
fuente