xml2x-0.2: src/Options.hs
{-# LANGUAGE Rank2Types #-}
module Options where
import System.Environment (getArgs)
import System.Console.GetOpt
import Control.Monad
import Bio.Util (countIO)
htmldir :: String
htmldir = "blast.d"
getOptions :: IO Options
getOptions = do as <- getArgs
let (optf,non,err) = getOpt Permute options as
when (not (null err)) $ error ("Usage: "++usage err)
if (null non && null as)
then error $ usageInfo ("Usage: "++usagemsg++synopsis) options
else do opt <- parseargs optf
return opt { inputs = non }
usage :: [String] -> String
usage errs = usageInfo (concat errs ++ usagemsg) options
usagemsg, synopsis :: String
usagemsg = "xml2x [options] blast.xml\n"
synopsis = "Convert BLASTX XML files to CSV or HTML\n"
++ "optionally adding GO annotations.\n"
data Options = Opts { godef, goann :: Maybe FilePath
, format :: Format
, output :: String -> IO ()
, inputs :: [FilePath]
-- verbosity/progress reporting
, verb :: Bool
, count :: forall a . Int -> String -> [a] -> IO [a]
-- output filtering
, select :: Select
}
data Format = Csv | Html deriving Eq
data Select = All | Top | Reg deriving Eq
options :: [OptDescr (Options -> IO Options)]
options = [Option [] ["go-defs"] (ReqArg (\arg opt -> return opt { godef = Just arg }) "File")
"Go ids and defs"
,Option [] ["annotations"] (ReqArg (\arg opt -> return opt { goann = Just arg }) "File")
"GOA associations"
-- Verbosity
,Option ['v'] ["verbose"]
(NoArg (\opt -> return opt {verb = True, count = \n msg -> countIO msg " ..done!\n" n }))
"Display progress"
,Option ['q'] ["quiet"] (NoArg (\opt -> return opt {verb = False, count = \_ _ -> return . id}))
"Don't display progress"
-- Output formats
,Option ['H'] ["html-output"] (NoArg (\opt -> return opt { format = Html }))
"Output HTML"
,Option ['C'] ["csv-output"] (NoArg (\opt -> return opt { format = Csv }))
"Output comma-separated values"
,Option ['o'] ["output-file"] (ReqArg (\arg opt -> return opt { output = writeFile arg }) "File")
"Output file"
,Option ['1'] ["top"] (NoArg (\opt -> return opt { select = Top }))
"Output only best BLAST hit"
,Option [] ["all"] (NoArg (\opt -> return opt { select = All }))
"Output all BLAST hits"
,Option [] ["regions"] (NoArg (\opt -> return opt { select = Reg }))
"Output distinct BLAST hit regions"
]
defaultopts :: Options
defaultopts = Opts { godef = Nothing, goann = Nothing, format = Csv
, output = putStr, verb = False, inputs = []
, count = \_ _ -> return . id, select = All }
parseargs :: [Options -> IO Options] -> IO Options
parseargs args = foldl (>>=) (return defaultopts) args >>= verify
where verify = return . id -- todo: check that files are correctly specified,
-- godef only makes sense with goann