packages feed

WL500gPControl-0.3.4: src/Common.hs

module Common 
    (
     defaultCredsFile
    ,toCredsFile
    ,parseCredsFile
    )where

import System.IO.Unsafe (unsafePerformIO)
import System.Environment (getEnv)
import Text.Printf (printf)
import qualified Network.Asus.WL500gP as W
import Data.Char (toLower)
import Control.Monad (liftM)
import System.Directory (getAppUserDataDirectory, createDirectoryIfMissing)
import System.FilePath ((</>))
    
appName = "WL500gPControl"
appConfDir = getAppUserDataDirectory appName

initConfDir = appConfDir >>= createDirectoryIfMissing True

defaultCredsFile = liftM (</> "credentials") appConfDir

toCredsFile :: Maybe String -> IO String
toCredsFile Nothing = defaultCredsFile
toCredsFile (Just f) = return f                      

parseCredsFile :: Maybe String -> IO (Maybe W.Connection)
parseCredsFile Nothing = do
  initConfDir >> defaultCredsFile >>= parseCredsFile . Just
parseCredsFile (Just fname) = 
    let toPair (a:b:[]) = (map toLower a, b)
        toPair _ = ("", "")
        parse = filter (/= ("", "")) . map (toPair . words) . lines
    in do
      contentsMap <- liftM parse $ readFile fname
      return $ do (host:passwd:user:[]) <- 
                      mapM (`lookup` contentsMap) ["host:"
                                                  ,"password:"
                                                  ,"user:"]
                  return $ W.Connection {W.user = user
                                        ,W.password = passwd
                                        ,W.hostname = host}