Eu tinha feito um daemon que usava uma forma muito primitiva de ipc
(telnet e enviar uma String que tinha certas palavras em uma determinada ordem). Eu saí dessa situação e agora estou usando JSON
para passar mensagens para um Yesod
servidor. No entanto, houve algumas coisas que realmente gostei no meu design, e não tenho certeza de quais são minhas escolhas agora.
Aqui está o que eu estava fazendo:
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 função em buildSeq parecia com isso
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
é um TMVar Map
que rastreia informações sobre os empregos atuais.
então agora, o que eu tenho são manipuladores, que se parecem com isso
foo :: Handler RepJson
foo
representa um comando para meu daemon, cada manipulador pode ter que processar um objeto JSON diferente.
O que eu gostaria de fazer é enviar um JSON
objeto que representa o sucesso e outro objeto JSON que expressa informações sobre alguma exceção.
Gostaria que foo
a função auxiliar pudesse retornar um Either
, mas não tenho certeza de como faço isso, além da capacidade de encerrar a avaliação da minha lista de ações buildSeq
,.
Aqui está a única escolha que vejo
1) certifique-se de que exceptionHandler
está no Handler. Coloque JobMap
no App
registro. Usando getYesod
alter o valor apropriado para JobMap
indicar detalhes sobre a exceção, que pode então ser acessado porfoo
Existe uma maneira melhor?
Quais são minhas outras opções?
Edit: Para maior clareza, explicarei o papel de Handler RepJson
. O servidor precisa de alguma forma de aceitar comandos como build
stop
report
. O cliente precisa de alguma forma de saber os resultados desses comandos. Escolhi JSON como o meio pelo qual o servidor e o cliente se comunicam. Estou usando o tipo Handler apenas para gerenciar a entrada / saída JSON e nada mais.