J'avais fait un démon qui a utilisé un très primitifs ipc
(telnet et d'envoyer une Chaîne de caractères qui avait certains mots dans un certain ordre). J'ai craqué et suis maintenant en utilisant JSON
de transmettre des messages à un Yesod
serveur. Cependant, il y avait certaines choses que j'ai vraiment aimé mon dessin, et je ne suis pas sûr de ce que mes choix sont maintenant.
Voici ce que je faisais:
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 ()
chaque fonction dans buildSeq ressemblait à ça
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
est TMVar Map
que des pistes d'informations sur les travaux en cours.
alors maintenant, ce que j'ai sont des Gestionnaires, que tous ressembler à ceci
foo :: Handler RepJson
foo
représente une commande pour mon démon, chaque gestionnaire peut avoir besoin de traiter un autre objet JSON.
Ce que je voudrais faire est d'envoyer un JSON
objet qui représente le succès, et un autre objet JSON qui espresses d'informations sur certains exception.
Je voudrais foo
s fonction d'assistance pour être en mesure de retourner un Either
, mais je ne suis pas sûr de savoir comment j'obtiens ce que, en plus de la possibilité de mettre fin à l'évaluation de ma liste d'actions, buildSeq
.
Voici le seul choix que je vois
1) assurez - exceptionHandler
est dans le Gestionnaire. Mettre JobMap
dans la App
record. À l'aide de getYesod
modifier la valeur appropriée en JobMap
indiquant des informations sur l'exception,
qui peut ensuite être consulté par foo
Est-il un meilleur moyen?
Quels sont mes choix?
Edit: Pour plus de clarté, je vais vous expliquer le rôle de l'Handler RepJson
. Le serveur a besoin d'un moyen d'accepter des commandes telles que build
stop
report
. Le client a besoin d'un moyen de connaître les résultats de ces commandes. J'ai choisi de JSON comme le medium avec lequel le serveur et le client de communiquer les uns avec les autres. Je suis en utilisant le Gestionnaire de type juste pour gérer le JSON/et rien de plus.