packages feed

concrete-haskell-0.1.0.8: utils/InspectCommunication.hs

{-# LANGUAGE OverloadedStrings, NoMonomorphismRestriction, FlexibleContexts, GADTs, MultiParamTypeClasses, FlexibleInstances #-}
module Main (main) where

import Data.Monoid ((<>))
import qualified Data.ByteString.Lazy as BS
import qualified Codec.Compression.GZip as GZip
import qualified Data.Concrete.Utils as CU
import qualified Data.Concrete as C
import qualified Options.Applicative as O
import Options.Applicative (option, auto, short, long, metavar, strOption, help, execParser, info, helper, fullDesc, progDesc, many)
import qualified Data.Vector as V
import Control.Monad (liftM, mapM, join)
import Data.List (intercalate, concat)
import qualified Data.Text.Lazy as T
import Data.Maybe (fromJust, catMaybes, maybeToList)
import System.IO (stdin, stdout, stderr, openFile, Handle, IOMode(..), hPutStrLn)
import System.FilePath (takeExtension)
data Parameters = Parameters { inputFile :: Maybe String
                             } deriving (Show)

parameters :: O.Parser Parameters
parameters = Parameters
             <$> (O.optional $ strOption (short 'i'
                                          <> long "input"
                                          <> metavar "INPUT_FILE"
                                          <> help "Communications to inspect, serialized with Compact protocol, where the file name is interpreted by ending (.zip, .gz, .tgz) backing off to uncompressed sequence of Communications.  If ommitted, read uncompressed sequence of Communications from stdin."
                                         )
                 )

main = do
  ps <- execParser opts
  cs <- case inputFile ps of
    Just f -> case takeExtension f of
      ".tar" -> error "tar not implemented yet"
      ".tgz" -> error "compressed tar not implemented yet"
      ".tbz2" -> error "compressed tar not implemented yet"
      ".zip" -> error "zip not implemented yet"
      ".bz2" -> error "bzip not implemented yet"
      ".gz" -> CU.readCommunicationsFromBytes <$> ((liftM GZip.decompress . BS.readFile) f)      
      _ -> CU.readCommunicationsFromBytes <$> (BS.readFile f)
    Nothing -> CU.readCommunicationsFromBytes <$> (BS.hGetContents stdin)
  cs' <- cs
  putStr $ ((T.unpack . T.concat) $ map CU.showCommunication cs')
  where
    opts = info (helper <*> parameters)
           ( fullDesc
             <> progDesc "Inspect a tar file of serialized Communications"
           )