Вызов сети IO изнутри haskeline
У меня есть существующая программа, которая принимает аргументы командной строки (имя пользователя, пароль, дата), а затем использует Network.HTTP.Conduit
библиотека для отправки сообщения XML на сервер. Затем я анализирую результаты, делаю некоторую работу и использую blaze-html для записи в файл.
Все это работает как шарм; Тем не менее, я думал, что я бы использовал 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-роводитель вообще когда-либо работает. Любые советы о том, как заставить это работать?
Заранее спасибо, Нил
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"