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 YesodServer 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
JobMapist 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 JSONObjekt 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 Eitherkann, 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 exceptionHandlersich in Handler befindet. Tragen Sie JobMapdie AppAufzeichnung ein. Mit getYesoddem entsprechenden Wert ändert in JobMapangibt , 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.