module Translate.Options
( TranslateArguments (..)
, Translate
, translateArguments
) where
import Control.Applicative
import Control.Monad.Logger
import Control.Monad.Trans.Reader
import Data.List
import Options.Applicative
import Tools
import ELynx.Data.Alphabet.Alphabet
import ELynx.Data.Character.Codon
import ELynx.Tools.Misc
data TranslateArguments = TranslateArguments
{ trAlphabet :: Alphabet
, trInFile :: Maybe FilePath
, trReadingFrame :: Int
, trUniversalCode :: UniversalCode }
type Translate = LoggingT (ReaderT TranslateArguments IO)
translateArguments :: Parser TranslateArguments
translateArguments = TranslateArguments <$>
alphabetOpt <*>
optional inFileArg <*>
readingFrameOpt <*>
universalCodeOpt
readingFrameOpt :: Parser Int
readingFrameOpt = option auto $
long "reading-frame" <>
short 'r' <>
metavar "INT" <>
help "Reading frame [0|1|2]."
universalCodeOpt :: Parser UniversalCode
universalCodeOpt = option auto $
long "universal-code" <>
short 'u' <>
metavar "CODE" <>
help ("universal code; one of: " ++ codeStr ++ ".")
where codes = allValues :: [UniversalCode]
codeWords = map show codes
codeStr = intercalate ", " codeWords
inFileArg :: Parser FilePath
inFileArg = strArgument $
metavar "INPUT-FILE" <>
help "Read sequences from INPUT-FILE"