packages feed

circe-0.2.0.0: exe/Main.hs

module Main (main) where

import Codec.Circe
import Codec.Circe.Pretty
import qualified Data.ByteString.Lazy as BS
import Data.Version
import Data.Word
import Options.Applicative
import Paths_circe

main :: IO ()
main = do
  cli <- circeCLI $ showVersion version
  case cli of
    CRC8Table  p -> putStrLn $ table $ w8  <$> crc8Table  p
    CRC16Table p -> putStrLn $ table $ w16 <$> crc16Table p
    CRC32Table p -> putStrLn $ table $ w32 <$> crc32Table p
    CRC64Table p -> putStrLn $ table $ w64 <$> crc64Table p
    CRC8  cfg (Just f) -> putStrLn . w8  . crc8  cfg =<< BS.readFile f
    CRC8  cfg Nothing  -> putStrLn . w8  . crc8  cfg =<< BS.getContents
    CRC16 cfg (Just f) -> putStrLn . w16 . crc16 cfg =<< BS.readFile f
    CRC16 cfg Nothing  -> putStrLn . w16 . crc16 cfg =<< BS.getContents
    CRC32 cfg (Just f) -> putStrLn . w32 . crc32 cfg =<< BS.readFile f
    CRC32 cfg Nothing  -> putStrLn . w32 . crc32 cfg =<< BS.getContents
    CRC64 cfg (Just f) -> putStrLn . w64 . crc64 cfg =<< BS.readFile f
    CRC64 cfg Nothing  -> putStrLn . w64 . crc64 cfg =<< BS.getContents

data CirceCLI
  = CRC8 CRC8Cfg (Maybe String)
  | CRC16 CRC16Cfg (Maybe String)
  | CRC32 CRC32Cfg (Maybe String)
  | CRC64 CRC64Cfg (Maybe String)
  | CRC8Table  Word8
  | CRC16Table Word16
  | CRC32Table Word32
  | CRC64Table Word64

-- | run CLI, specify version string
circeCLI :: String -> IO CirceCLI
circeCLI = customExecParser prefs' . pinfo

prefs' :: ParserPrefs
prefs' = prefs $ showHelpOnError <> showHelpOnEmpty

pinfo :: String -> ParserInfo CirceCLI
pinfo vStr = info (parser <**> simpleVersioner vStr <**> helper) $
  progDesc "CIRCE - cyclic redundancy check"

parser :: Parser CirceCLI
parser = hsubparser $ mconcat
  [ command "8"  $ info crc8Parser  $ progDesc "CRC8"
  , command "16" $ info crc16Parser $ progDesc "CRC16"
  , command "32" $ info crc32Parser $ progDesc "CRC32"
  , command "64" $ info crc64Parser $ progDesc "CRC64"
  ]

crc8Parser :: Parser CirceCLI
crc8Parser = asum
  [ CRC8 <$> crc8CfgParser <*> optional fileArg
  , CRC8Table <$> tableOpt 8
  ]

crc16Parser :: Parser CirceCLI
crc16Parser = asum
  [ CRC16 <$> crc16CfgParser <*> optional fileArg
  , CRC16Table <$> tableOpt 16
  ]

crc32Parser :: Parser CirceCLI
crc32Parser = asum
  [ CRC32 <$> crc32CfgParser <*> optional fileArg
  , CRC32Table <$> tableOpt 32
  ]

crc64Parser :: Parser CirceCLI
crc64Parser = asum
  [ CRC64 <$> crc64CfgParser <*> optional fileArg
  , CRC64Table <$> tableOpt 64
  ]

tableOpt :: (Num a, Read a) => Int -> Parser a
tableOpt n = option auto $ mconcat
  [ short 't' <> long "table" <> metavar "POLY"
  , help $ "Generate CRC" <> show n <> " lookup table with polynomial"
  ]

crc8CfgParser :: Parser CRC8Cfg
crc8CfgParser = asum
  [ flag' crc8Cfg $ long "crc8" <> help ("DEFAULT " ++ showCRC8Cfg crc8Cfg)
  , flag' crc88H2F $ long "8h2f" <> help (showCRC8Cfg crc88H2F)
  , flag' crc8CDMA2k $ long "cdma2k" <> help (showCRC8Cfg crc8CDMA2k)
  , flag' crc8DARC $ long "darc" <> help (showCRC8Cfg crc8DARC)
  , flag' crc8DVBS2 $ long "dvbs2" <> help (showCRC8Cfg crc8DVBS2)
  , flag' crc8EBU $ long "ebu" <> help (showCRC8Cfg crc8EBU)
  , flag' crc8ICode $ long "icode" <> help (showCRC8Cfg crc8ICode)
  , flag' crc8ITU $ long "itu" <> help (showCRC8Cfg crc8ITU)
  , flag' crc8Maxim $ long "maxim" <> help (showCRC8Cfg crc8Maxim)
  , flag' crc8ROHC $ long "rohc" <> help (showCRC8Cfg crc8ROHC)
  , flag' crc8WCDMA $ long "wcdma" <> help (showCRC8Cfg crc8WCDMA)
  , crcCfgParser
  , pure crc8Cfg
  ]

crc16CfgParser :: Parser CRC16Cfg
crc16CfgParser = asum
  [ flag' crc16CCITZero $ long "ccit-zero" <> help ("DEFAULT " ++ showCRC16Cfg crc16CCITZero)
  , flag' crc16Arc $ long "arc" <> help (showCRC16Cfg crc16Arc)
  , flag' crc16AugCCITT $ long "aug-ccit" <> help (showCRC16Cfg crc16AugCCITT)
  , flag' crc16Buypass $ long "buypass" <> help (showCRC16Cfg crc16Buypass)
  , flag' crc16CCITTFalse $ long "ccitt-false" <> help (showCRC16Cfg crc16CCITTFalse)
  , flag' crc16CDMA2k $ long "cdma2k" <> help (showCRC16Cfg crc16CDMA2k)
  , flag' crc16DDS110 $ long "dds110" <> help (showCRC16Cfg crc16DDS110)
  , flag' crc16DECTR $ long "dectr" <> help (showCRC16Cfg crc16DECTR)
  , flag' crc16DECTX $ long "dectx" <> help (showCRC16Cfg crc16DECTX)
  , flag' crc16DNP $ long "dnp" <> help (showCRC16Cfg crc16DNP)
  , flag' crc16EN13757 $ long "en13757" <> help (showCRC16Cfg crc16EN13757)
  , flag' crc16Genibus $ long "genibus" <> help (showCRC16Cfg crc16Genibus)
  , flag' crc16Maxim $ long "maxim" <> help (showCRC16Cfg crc16Maxim)
  , flag' crc16MCRF4XX $ long "mcrf4xx" <> help (showCRC16Cfg crc16MCRF4XX)
  , flag' crc16Riello $ long "riello" <> help (showCRC16Cfg crc16Riello)
  , flag' crc16T10DIF $ long "t10dif" <> help (showCRC16Cfg crc16T10DIF)
  , flag' crc16Teledisk $ long "teledisk" <> help (showCRC16Cfg crc16Teledisk)
  , flag' crc16TMS37157 $ long "tms37157" <> help (showCRC16Cfg crc16TMS37157)
  , flag' crc16USB $ long "usb" <> help (showCRC16Cfg crc16USB)
  , flag' crc16CRCA $ long "crca" <> help (showCRC16Cfg crc16CRCA)
  , flag' crc16Kermit $ long "kermit" <> help (showCRC16Cfg crc16Kermit)
  , flag' crc16Modbus $ long "modbus" <> help (showCRC16Cfg crc16Modbus)
  , flag' crc16X25 $ long "x25" <> help (showCRC16Cfg crc16X25)
  , flag' crc16XModem $ long "xmodem" <> help (showCRC16Cfg crc16XModem)
  , crcCfgParser
  , pure crc16CCITZero
  ]

crc32CfgParser :: Parser CRC32Cfg
crc32CfgParser = asum
  [ flag' crc32IEEE $ long "ieee" <> help ("DEFAULT " ++ showCRC32Cfg crc32IEEE)
  , flag' crc32BZIP2 $ long "bzip2" <> help (showCRC32Cfg crc32BZIP2)
  , flag' crc32MPEG2 $ long "mpeg2" <> help (showCRC32Cfg crc32MPEG2)
  , flag' crc32POSIX $ long "posix" <> help (showCRC32Cfg crc32POSIX)
  , crcCfgParser
  , pure crc32IEEE
  ]

crc64CfgParser :: Parser CRC64Cfg
crc64CfgParser = asum
  [ flag' crc64ECMA182 $ long "ecma-182" <> help ("DEFAULT " ++ showCRC64Cfg crc64ECMA182)
  , flag' crc64GoISO $ long "go-iso" <> help (showCRC64Cfg crc64GoISO)
  , flag' crc64WE $ long "we" <> help (showCRC64Cfg crc64WE)
  , flag' crc64XZ $ long "xz" <> help (showCRC64Cfg crc64XZ)
  , crcCfgParser
  , pure crc64ECMA182
  ]

crcCfgParser :: Read a => Parser (CRCCfg a)
crcCfgParser =
  CRCCfg
    <$> option auto (short 'p' <> long "poly" <> help "polynomial")
    <*> option auto (short 'i' <> long "init" <> help "initial value")
    <*> refinSwitch
    <*> refoutSwitch
    <*> option auto (short 'x' <> long "xor" <> help "final xor")

refinSwitch :: Parser Bool
refinSwitch = switch $ long "ri" <> long "refin" <> help "reflect input"

refoutSwitch :: Parser Bool
refoutSwitch = switch $ long "ro" <> long "refout" <> help "reflect output"

fileArg :: Parser String
fileArg = strArgument $
  metavar "FILE" <> completer (bashCompleter "file")
    <> help "Optional binary input file otherwise stream STDIN."