2012-06-13 48 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

おかげでクリス(私は...これをコンパイルするので、構文エラーを修正すること自由に感じていなかった)、私はこれで問題がrunInpuT'は()型である 'ということだと思います。実際のタイプ '(t0、t1、t2) 'と期待されるタイプ'()'を一致させることができませんでした。 'return 'の最初の引数、つまり '(username、パスワード、日付) ' return(username、password、date) ' do '式のstmtの場合: ちょうど日付< - getInputLine "日付(YYYYMMDD):" – Neil

+0

ループ関数を別にしてIO(String、String、String)を返すとうまくいきました。あなたの助けに感謝クリス。 – Neil

関連する問題