2012-04-12 2 views
93

매우 원시적 인 형태 인 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의 역할을 설명합니다. 서버는 buildstopreport과 같은 명령을 수락 할 수있는 방법이 필요합니다. 클라이언트는 이러한 명령의 결과를 알 수있는 방법이 필요합니다. JSON을 서버와 클라이언트가 서로 통신하는 매체로 선택했습니다. JSON in/out 및 더 많은 것을 관리하기 위해 Handler 유형을 사용하고 있습니다.

답변

9

Haskell/Yesod 세계에서 값을 전달하기보다는 뒤로 가져 가기를 원합니다. 따라서 처리기가 값을 반환하는 대신 프로세스의 다음 단계로 전달하도록 요청하면 예외가 발생할 수 있습니다.

향후 작업을 하나의 객체로 묶을 수 있으므로 연속 객체를 처리기 및 전달자에게 전달할 수 있으므로 "완료 한 후에는이 코드 블록을 실행하십시오."라고 기본적으로 알려줍니다. 그런 식으로 그들은 무효화 될 수없고 아무것도 반환하지 않습니다.

+0

통찰력을 주셔서 감사합니다. Tyler Durden. –