2012-06-13 18 views
5

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

Respuesta

1

usted afirma que trabajó con nombre de usuario no modificable, contraseña, fecha antes haskeline. Para ayudar a depurar, quizás no puedas subir el conducto a InputT. ¿Sigue fallando lo siguiente? (No recopilar la información, por lo que no dude en corregir los errores de sintaxis ...)

-- 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

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

+0

Terminé por romper el función de bucle por separado y devolver IO (String, String, String) y funcionó. Gracias por su ayuda Chris. – Neil