Ich hatte einen Daemon erstellt, der eine sehr primitive Form von ipc
(Telnet und Senden eines Strings mit bestimmten Wörtern in einer bestimmten Reihenfolge) verwendete. Ich habe es herausgeschnappt und verwende es jetzt JSON
, um Nachrichten an einen Yesod
Server weiterzuleiten . Es gab jedoch einige Dinge, die mir an meinem Design sehr gut gefallen haben, und ich bin mir nicht sicher, wie ich mich jetzt entscheide.
Folgendes habe ich getan:
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 ()
Jede Funktion in buildSeq sah so aus
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
ist eine TMVar Map
, die Informationen über aktuelle Jobs verfolgt.
Was ich jetzt habe, sind Handler, die alle so aussehen
foo :: Handler RepJson
foo
stellt einen Befehl für meinen Daemon dar. Jeder Handler muss möglicherweise ein anderes JSON-Objekt verarbeiten.
Ich möchte ein JSON
Objekt senden , das den Erfolg darstellt, und ein anderes JSON-Objekt, das Informationen über eine Ausnahme unterdrückt.
Ich möchte foo
, dass die Hilfsfunktion eine zurückgeben Either
kann, bin mir aber nicht sicher, wie ich das bekomme, sowie die Möglichkeit, die Auswertung meiner Aktionsliste zu beenden buildSeq
.
Hier ist die einzige Wahl, die ich sehe
1) Stellen Sie sicher, dass exceptionHandler
sich in Handler befindet. Tragen Sie JobMap
die App
Aufzeichnung ein. Mit getYesod
dem entsprechenden Wert ändert in JobMap
angibt , Einzelheiten über die Ausnahme, die durchgeführt wird , kann dann zugegriffenfoo
Gibt es einen besseren Weg?
Was sind meine anderen Möglichkeiten?
Bearbeiten: Aus Gründen der Klarheit werde ich die Rolle von erklären Handler RepJson
. Der Server benötigt eine Möglichkeit, Befehle wie zu akzeptieren build
stop
report
. Der Client muss die Ergebnisse dieser Befehle kennen. Ich habe JSON als Medium ausgewählt, mit dem Server und Client miteinander kommunizieren. Ich verwende den Handler-Typ nur, um den JSON-Ein- / Ausgang zu verwalten, und nicht mehr.