2012-06-13 2 views
5

명령 줄 인수 (사용자 이름, 암호, 날짜)를 사용하는 기존 프로그램이 있고 Network.HTTP.Conduit 라이브러리를 사용하여 xml 메시지를 서버에 게시합니다. 그런 다음 결과를 파싱하고, 일부 작업을 수행하고, blaze-html을 사용하여 파일에 기록합니다.haskeline에서 네트워크 IO를 호출합니다.

모든 기능이 매력적입니다. 그러나 암호를 볼 수 없도록 haskeline을 사용한다고 생각했습니다. 사용자가 제공 한 값을 가져 와서 출력하는 커맨드 라인 프로그램을 만들 수 있지만, 콘딧을 사용하는 함수를 호출하면 절대 반환하지 않습니다.

main = runInputT defaultSettings loop 
where 
    loop :: InputT IO() 
    loop = do 
     Just username <- getInputLine "WM username: " 
     Just password <- getPassword (Just '*') "WM password: " 
     Just date  <- getInputLine "Date (YYYYMMDD): " 

     outputStrLn "querying WM..." 
     clients <- lift $ getWMClients username password 
     outputStrLn "successfully retrieved client list from WM..." 

     let outHeader = renderHeader date username 

     reportString <- mapM (\x -> createString x clients) cList 

     lift $ writeFile (date ++ "_report.html") (outHeader ++ concat reportString) 
     outputStrLn "Done" 

함수 getWMClients 기능은 다음과 같습니다 : 나는 그것을 중단시 프로그램 실행하면

getWMClients :: Username -> String -> IO [Client] 
getWMClients username password = do 
    let f = [Size "-1", Skip "0"] 
    let fs = [Select "id", 
       Select "status", 
       Select "last-name", 
       Select "first-name", 
      ] 
    let query = WMQuery {transaction=SHARE,service=Query,businessObject=CONT,field=f,fields=fs} 

    results <- doQuery username (Just password) Nothing (Just query) 
    rows <- xmlResultsToMaps results 

    let clients = map makeClient rows 
    return clients 

"WM 쿼리를 ..."나는 생각하지 않는다 여기

는 잘못된 코드 http-conduit은 실제로 실행 중입니다. 이 작업을 수행하는 방법에 대한 힌트가 있습니까? 사전에

감사합니다, 닐

답변

1

당신은 하드 코드 된 사용자 이름, 암호, haskeline 전에 날짜와 함께 일 주장한다. 디버깅을 돕기 위해 아마도 도관을 InputT로 들어 올릴 수 없습니다. 다음은 여전히 ​​실패합니까? (나는 이것을 컴파일하지 않았기 때문에 문법 오류를 수정하는 것이 자유 롭다.)

-- Isolate the haskeline monad to just the input part: 
main = loop 
where 
    loop :: IO() 
    loop = do 
     (username,password,date) <- runInputT defaultSettings $ do 
     Just username <- getInputLine "WM username: " 
     Just password <- getPassword (Just '*') "WM password: " 
     Just date  <- getInputLine "Date (YYYYMMDD): " 
     return (username,password,date) 

     putStrLn "querying WM..." 
     clients <- getWMClients username password 
     putStrLn "successfully retrieved client list from WM..." 

     let outHeader = renderHeader date username 

     putString <- mapM (\x -> createString x clients) cList 

     writeFile (date ++ "_report.html") (outHeader ++ concat reportString) 
     putStrLn "Done" 
+0

감사합니다. Chris 님,이 문제는 runInpuT가() 유형이라고 생각합니다. 'return '의 첫 번째 인수 인 '(사용자 이름, 사용자 이름, 사용자 이름)에서'예상 유형 '(실제 유형'(t0, t1, t2) '과 일치 할 수 없습니다. 암호, 날짜) ' 표현식에서 return (사용자 이름, 암호, 날짜) 'do '식의 문자열에서 : Just date <- getInputLine "Date (YYYYMMDD) :"' – Neil

+0

루프 함수를 분리하여 IO (String, String, String)를 반환하면 효과가있었습니다. 크리스에게 도움을 주셔서 감사합니다. – Neil

관련 문제