매우 원시적 인 형태 인 ipc
(telnet을 사용하고 특정 순서로 특정 단어가있는 String을 보내는 데몬)을 만들었습니다. 나는 그걸 꺼내서 JSON
을 사용하여 Yesod
서버에 메시지를 전달했습니다. 그러나, 내 디자인에 대해 정말 좋아하는 것들이 있었고, 지금 내 선택이 무엇인지 확신 할 수 없습니다.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
이 핸들러에 있는지 확인을 볼 수있는 유일한 선택입니다. App
레코드에 JobMap
을 입력하십시오. getYesod
다음 foo
더 나은 방법이 있나요 액세스 할 수있는 예외에 대한 세부 정보를 나타내는 JobMap
에 적절한 값, 을 변경 사용?
다른 선택은 무엇입니까?
편집 : 명확성을 위해 Handler RepJson
의 역할을 설명합니다. 서버는 build
stop
report
과 같은 명령을 수락 할 수있는 방법이 필요합니다. 클라이언트는 이러한 명령의 결과를 알 수있는 방법이 필요합니다. JSON을 서버와 클라이언트가 서로 통신하는 매체로 선택했습니다. JSON in/out 및 더 많은 것을 관리하기 위해 Handler 유형을 사용하고 있습니다.
통찰력을 주셔서 감사합니다. Tyler Durden. –