5

コマンドライン引数 (ユーザー名、パスワード、日付) を受け取り、Network.HTTP.Conduitライブラリを使用して xml メッセージをサーバーに送信する既存のプログラムがあります。次に、結果を解析し、いくつかの作業を行い、blaze-html を使用してファイルに書き出します。

それはすべて魔法のように機能します。haskelineただし、パスワードが表示されないように使用すると思いました。ユーザーが指定した値を取得して出力するコマンド ライン プログラムを作成することはできますが、conduit を使用する関数を呼び出しても戻りません。

問題のあるコードは次のとおりです。

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

プログラムを実行すると、「querying WM...」でハングします。http-conduit が実際に実行されているとは思えません。これを機能させる方法に関するヒントはありますか?

前もってありがとう、ニール

4

1 に答える 1

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"
于 2012-06-13T09:08:15.953 に答える