Я создал демона, который использовал очень примитивную форму 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
измените соответствующее значение для JobMap
указания деталей об исключении, к которым затем может получить доступfoo
Есть ли способ лучше?
Какие у меня другие варианты?
Изменить: для ясности я объясню роль Handler RepJson
. Серверу нужен способ принимать такие команды, как build
stop
report
. Клиенту нужен способ узнать результаты этих команд. Я выбрал JSON в качестве среды, с помощью которой сервер и клиент взаимодействуют друг с другом. Я использую тип Handler только для управления входом / выходом JSON и не более того.
источник