Я створив демон, який використовував дуже примітивну форму ipc
(telnet і надіслати рядок, який містив певні слова в певному порядку). Я вирвався з нього і зараз використовую 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
що відстежує інформацію про поточні робочі місця.
тож зараз у мене є Хендлери, які все виглядають так
foo :: Handler RepJson
foo
представляє команду для мого демона, кожному обробнику може знадобитися обробити інший об'єкт JSON.
Що я хотів би зробити, це надіслати один JSON
об’єкт, який представляє успіх, і інший об’єкт JSON, який відображає інформацію про якийсь виняток.
Я хотів би foo
з функцією помічника , щоб мати можливість повертати Either
, але я не знаю , як я розумію , що, плюс можливість завершити оцінку мого списку дій, buildSeq
.
Ось єдиний вибір, який я бачу
1) переконайтеся, що exceptionHandler
знаходиться в Handler. Помістіть JobMap
в App
запис. Використовуючи getYesod
alter відповідне значення для JobMap
зазначення деталей про виняток, до якого потім можна отримати доступfoo
Чи є кращий спосіб?
Які мої інші варіанти?
Редагувати: Для наочності я пояснить роль Handler RepJson
. Сервер потребує певного способу прийому таких команд, як build
stop
report
. Клієнт потребує певного способу знати результати цих команд. Я вибрав JSON як засіб, за допомогою якого сервер і клієнт спілкуються між собою. Я використовую тип Handler просто для управління входом / виходом JSON і не більше того.