명령 줄 인수 (사용자 이름, 암호, 날짜)를 사용하는 기존 프로그램이 있고 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은 실제로 실행 중입니다. 이 작업을 수행하는 방법에 대한 힌트가 있습니까? 사전에감사합니다, 닐
감사합니다. Chris 님,이 문제는 runInpuT가() 유형이라고 생각합니다. 'return '의 첫 번째 인수 인 '(사용자 이름, 사용자 이름, 사용자 이름)에서'예상 유형 '(실제 유형'(t0, t1, t2) '과 일치 할 수 없습니다. 암호, 날짜) ' 표현식에서 return (사용자 이름, 암호, 날짜) 'do '식의 문자열에서 : Just date <- getInputLine "Date (YYYYMMDD) :"' – Neil
루프 함수를 분리하여 IO (String, String, String)를 반환하면 효과가있었습니다. 크리스에게 도움을 주셔서 감사합니다. – Neil