나는 아주 원시적 인 형태의 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 객체를 보내는 것 입니다.
내가 좋아하는 것 foo
의 도우미 함수는를 반환 할 수있는 Either
,하지만 난 그 얻을 플러스 행동의 내 목록의 평가를 종료 할 수 방법을 모르겠어요 buildSeq
.
여기에 내가 보는 유일한 선택
1) exceptionHandler
핸들러에 있는지 확인하십시오 . 넣어 JobMap
에 App
기록. 사용 getYesod
에 적절한 값 변경 JobMap
후 액세스 할 수있는 예외에 대한 세부 사항을 표시를,foo
더 좋은 방법이 있습니까?
다른 선택은 무엇입니까?
편집 : 명확성을 위해의 역할을 설명하겠습니다 Handler RepJson
. 서버는 build
stop
report
. 클라이언트는 이러한 명령의 결과를 알 수있는 방법이 필요합니다. 서버와 클라이언트가 서로 통신하는 매체로 JSON을 선택했습니다. JSON 입출력을 관리하기 위해 핸들러 유형을 사용하고 있습니다.