packages feed

haskdeep-0.2.0.1: src/Options.hs

-- |
-- Module      :  HaskDeep.Command.Options
-- Copyright   :  Mauro Taraborelli 2012
-- License     :  BSD3
--
-- Maintainer  :  maurotaraborelli@gmail.com
-- Stability   :  experimental
-- Portability :  unknown
--
-- Computes hashes traversing recursively through the directory structure.
-- Use a list of known hashes to audit a set of files.

module Options
    (
     Options(..)
    ,OptExecution(..)
    ,OptCompMode(..)
    ,optionsPI
    ,haskdeepVersion
    )
where

import           Prelude hiding (FilePath)

import           Data.Text (Text)
import qualified Data.Text as T
import           Data.Time (UTCTime)
import qualified Data.Time.Format as DTF
import           Options.Applicative

import           HaskDeep

haskdeepVersion :: String
haskdeepVersion = "haskdeep 0.2.0.1 - file hashing and audit"

data Options = Version
             | Options OptExecution OptCompMode HaskDeepConfiguration

data OptExecution = OptComputation
                  | OptAudit

data OptCompMode = OptMD5
                 | OptSHA1
                 | OptSHA256
                 | OptSkein512

optionsPI :: ParserInfo Options
optionsPI = info (helper <*> optionsP)
            ( fullDesc
              <> progDesc "Computes hashes and audit a set of files"
              <> header haskdeepVersion)

configurationP :: Parser HaskDeepConfiguration
configurationP = HaskDeepConfiguration
                 <$> strOption
                         ( long "root"
                           <> short 'r'
                           <> metavar "DIRNAME"
                           <> help "Root directory - default current directory"
                           <> value (rootDirectory defaultHaskDeepConfiguration))
                 <*> strOption
                         ( long "known"
                           <> short 'k'
                           <> metavar "FILENAME"
                           <> help "Known hashes file - default known.haskdeep"
                           <> value (knownHashes defaultHaskDeepConfiguration))
                 <*> option (str >>= parseText)
                         ( long "excl-regex"
                           <> short 'e'
                           <> metavar "REGEX"
                           <> help "Exclude files or directories based on regex"
                           <> value (excludeRegex defaultHaskDeepConfiguration)
                           <> hidden )
                 <*> option (str >>= parseTime)
                         ( long "incl-mod-from"
                           <> short 'f'
                           <> metavar "DATE"
                           <> help "Include files modified from yyyy-mm-ddThh:mm:ssZ"
                           <> value (includeModFrom defaultHaskDeepConfiguration)
                           <> hidden )
                 <*> option (str >>= parseTime)
                         ( long "incl-mod-upto"
                           <> short 't'
                           <> metavar "DATE"
                           <> help "Include files modified up to yyyy-mm-ddThh:mm:ssZ"
                           <> value (includeModUpTo defaultHaskDeepConfiguration)
                           <> hidden )

optionsP :: Parser Options
optionsP = flag' Version
                   ( long "version"
                     <> short 'v'
                     <> help "Show version information"
                     <> hidden )
           <|> ( Options
                 <$> subparser
                         ( command "compute"
                           (info (pure OptComputation)
                            (progDesc "Computes file hashes and saves them to known hashes file"))
                           <> command "audit"
                           (info (pure OptAudit)
                            (progDesc "Audit files comparing them to known hashes")))
                 <*> option (str >>= parseOptCompMode)
                         ( long "computation"
                           <> short 'c'
                           <> metavar "MODE"
                           <> help "md5 | sha1 | sha256 | skein512 - default md5"
                           <> value OptMD5)
                 <*> configurationP )


parseOptCompMode :: String -> ReadM OptCompMode
parseOptCompMode "md5"      = return OptMD5
parseOptCompMode "sha1"     = return OptSHA1
parseOptCompMode "sha256"   = return OptSHA256
parseOptCompMode "skein512" = return OptSkein512
parseOptCompMode _          = readerAbort ShowHelpText

parseText :: String -> ReadM (Maybe Text)
parseText s = return $ Just $ T.pack s

parseTime :: String -> ReadM (Maybe UTCTime)
parseTime s = case parsedTime of
                (Just _) -> return parsedTime
                Nothing  -> readerAbort ShowHelpText
    where
      parsedTime = DTF.parseTimeM True DTF.defaultTimeLocale "%FT%TZ" s