ฉันได้สร้างภูตที่ใช้รูปแบบดั้งเดิมของipc
(เทลเน็ตและส่งสตริงที่มีคำบางคำตามลำดับ) ฉันหักออกและตอนนี้กำลังใช้JSON
เพื่อส่งข้อความไปยังYesod
เซิร์ฟเวอร์ อย่างไรก็ตามมีบางสิ่งที่ฉันชอบมากเกี่ยวกับการออกแบบของฉันและฉันไม่แน่ใจว่าตอนนี้ตัวเลือกของฉันคืออะไร
นี่คือสิ่งที่ฉันกำลังทำ:
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 ()
แต่ละฟังก์ชันใน buildSeq มีลักษณะเช่นนี้
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
เป็นTMVar Map
ที่ติดตามข้อมูลเกี่ยวกับงานปัจจุบัน
ตอนนี้สิ่งที่ฉันมีคือ Handlers ซึ่งทั้งหมดมีลักษณะเช่นนี้
foo :: Handler RepJson
foo
แทนคำสั่งสำหรับ daemon ของฉันตัวจัดการแต่ละตัวอาจต้องประมวลผลออบเจ็กต์ JSON ที่แตกต่างกัน
สิ่งที่ฉันต้องการทำคือส่งJSON
ออบเจ็กต์หนึ่งที่แสดงถึงความสำเร็จและออบเจ็กต์ JSON อีกอันที่บีบอัดข้อมูลเกี่ยวกับข้อยกเว้นบางอย่าง
ฉันต้องการfoo
ฟังก์ชันช่วยที่จะสามารถที่จะกลับแต่ผมไม่แน่ใจว่าวิธีการที่ฉันได้รับที่บวกกับความสามารถในการยุติการประเมินผลของรายการของฉันของการกระทำEither
buildSeq
นี่เป็นทางเลือกเดียวที่ฉันเห็น
1) ตรวจสอบให้แน่ใจว่าexceptionHandler
อยู่ใน Handler ใส่JobMap
ในApp
บันทึก ใช้getYesod
แก้ไขค่าที่เหมาะสมในการJobMap
ระบุรายละเอียดเกี่ยวกับข้อยกเว้นซึ่งสามารถเข้าถึงได้โดยfoo
มีวิธีที่ดีกว่า?
ตัวเลือกอื่น ๆ ของฉันคืออะไร?
แก้ไข: Handler RepJson
เพื่อความชัดเจนผมจะอธิบายบทบาทของ เซิร์ฟเวอร์ต้องการวิธีบางอย่างในการยอมรับคำสั่งเช่นbuild
stop
report
. ไคลเอนต์ต้องการวิธีที่จะทราบผลลัพธ์ของคำสั่งเหล่านี้ ฉันเลือก JSON เป็นสื่อกลางที่เซิร์ฟเวอร์และไคลเอนต์สื่อสารกัน ฉันใช้ประเภท Handler เพื่อจัดการ JSON เข้า / ออกและไม่มีอะไรเพิ่มเติม