コマンドライン引数(ユーザー名、パスワード、日付)を受け取り、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は実際に実行されています。どのようにこの作品を作るためのヒント?事前に
おかげで、 ニール
おかげでクリス(私は...これをコンパイルするので、構文エラーを修正すること自由に感じていなかった)、私はこれで問題がrunInpuT'は()型である 'ということだと思います。実際のタイプ '(t0、t1、t2) 'と期待されるタイプ'()'を一致させることができませんでした。 'return 'の最初の引数、つまり '(username、パスワード、日付) ' return(username、password、date) ' do '式のstmtの場合: ちょうど日付< - getInputLine "日付(YYYYMMDD):" – Neil
ループ関数を別にしてIO(String、String、String)を返すとうまくいきました。あなたの助けに感謝クリス。 – Neil