Tengo un programa existente que toma argumentos de línea de comandos (nombre de usuario, contraseña, fecha) y luego usa la biblioteca Network.HTTP.Conduit
para publicar un mensaje xml en un servidor. Luego analizo los resultados, trabajo y uso blaze-html para escribir en un archivo.llamando a la red IO desde haskeline
Todo funciona como un encanto; sin embargo, pensé que usaría haskeline
para que la contraseña no sea visible. Puedo crear un programa de línea de comando que obtenga los valores proporcionados por el usuario y los imprima, pero si llamo a la función que usa el conducto, nunca regresa.
Aquí está el código erróneo:
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"
La función getWMClients función es:
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
Cuando ejecuto el programa se cuelga en "consultar WM ..." No creo http-conduit realmente se está ejecutando. ¿Alguna pista sobre cómo hacer que esto funcione?
Gracias de antemano, Neil
Gracias Chris, creo que el problema con esto es que 'runInpuT' es del tipo(). Cuando intento esto, aparece el mensaje de error: 'No se pudo coincidir con el tipo esperado'() 'con el tipo real '(t0, t1, t2)' En el primer argumento de 'return', es decir, ' (nombre de usuario, contraseña, fecha) ' En la expresión: return (nombre de usuario, contraseña, fecha) En un stmt de una expresión' do ': Just date <- getInputLine "Date (YYYYMMDD):" ' – Neil
Terminé por romper el función de bucle por separado y devolver IO (String, String, String) y funcionó. Gracias por su ayuda Chris. – Neil