Вопрос по json, haskell – Исключения в Йесод

93

Я сделал демона, который использовал очень примитивную форму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 который отслеживает информацию о текущих рабочих местах.

так что теперь у меня есть обработчики, что все выглядит так

foo :: Handler RepJson

foo представляет команду для моего демона, каждый обработчик может обрабатывать разные объекты JSON.

Что я хотел бы сделать, это отправить одинJSON объект, который представляет успех, и другой объект JSON, который выдает информацию о каком-то исключении.

мне бы хотелосьfoos вспомогательная функция, чтобы иметь возможность вернутьEither, но я не уверен, как это получить, плюс возможность прекратить оценку моего списка действий,buildSeq.

Вот единственный выбор, который я вижу

1) убедитесьexceptionHandler находится в обработчике. ПоложилJobMap вApp запись. С помощьюgetYesod изменить соответствующее значение вJobMap указание сведений об исключении, которые могут быть доступныfoo

Есть ли способ лучше?

Какие у меня есть другие варианты?

Изменить: для ясности я объясню рольHandler RepJson, Серверу нужен способ принимать команды, такие какbuild stop report, Клиенту нужен какой-то способ узнать результаты этих команд. Я выбрал JSON в качестве среды, с которой сервер и клиент общаются друг с другом. Я использую тип Handler просто для управления входом / выходом JSON и ничего более.

Ваш Ответ

1   ответ
9

в мире Haskell / Yesod вы хотите передавать значения вперед, а не возвращать их назад. Таким образом, вместо того, чтобы обработчики возвращали значение, они должны вызывать переадресацию на следующий шаг процесса, который может быть для генерации исключения.

Помните, что вы можете связать любое количество будущих действий в один объект, чтобы вы могли передать объект продолжения своим обработчикам и foos, который в основном говорит им: «После того, как вы закончите, запустите этот блок кода». Таким образом они могут быть недействительными и ничего не возвращать.

Похожие вопросы