mptcpanalyzer-0.0.2.0: src/MptcpAnalyzer/Commands/Load.hs
{-|
Module: MptcpAnalyzer.Commands.Load
Maintainer : matt
License : GPL-3
-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
module MptcpAnalyzer.Commands.Load (
cmdLoadCsv
, piLoadCsv
, piLoadPcapOpts
, filenameReader
)
where
import MptcpAnalyzer.Cache
import MptcpAnalyzer.Commands.Definitions as CMD
import MptcpAnalyzer.Loader
import MptcpAnalyzer.Pcap
import MptcpAnalyzer.Types
import MptcpAnalyzer.Utils.Completion (completePath, readFilename)
import MptcpAnalyzer.Utils.Text
-- import Control.Lens hiding (argument)
import Control.Monad.Trans (liftIO)
import Distribution.Simple.Utils (TempFileOptions(..), withTempFileEx)
import Frames
import Options.Applicative
import System.Exit (ExitCode(..))
-- import Prelude hiding (log)
import Options.Applicative.Builder (allPositional)
import Polysemy (Embed, Members, Sem)
import Polysemy.Log (Log)
import qualified Polysemy.Log as Log
import qualified Polysemy.State as P
import qualified Polysemy.Trace as P
import Control.Monad.Trans.Except
(ExceptT(..), runExcept, runExceptT, throwE, withExcept)
filenameReader :: ReadM FilePath
filenameReader = eitherReader readFilename
-- case readFilename filename of
-- Left err -> ReadM . lift . throwE
-- Right path -> path
-- (eitherReader readFilename)
loadPcapArgs :: Parser CommandArgs
loadPcapArgs = ArgsLoadPcap <$>
argument filenameReader (metavar "PCAP"
<> completer completePath
<> help "Load a Pcap file"
)
cmdLoadCsvArgs :: Parser CommandArgs
cmdLoadCsvArgs = ArgsLoadCsv <$> (
argument str (
metavar "CSV"
-- <> action "file"
<> completer completePath
<> help "Load a Csv file"
))
<*> argument auto (metavar "bool"
<> completeWith ["true", "false"]
<> help "boolean just to test something"
)
piLoadCsv :: ParserInfo CommandArgs
piLoadCsv = info (cmdLoadCsvArgs <**> helper)
( fullDesc
<> progDesc "Load a csv file generated from wireshark"
)
piLoadPcapOpts :: ParserInfo CommandArgs
-- <**> helper)
piLoadPcapOpts = info loadPcapArgs
( fullDesc
<> progDesc "Load a pcap file via wireshark"
<> footer "Example: load-pcap examples/client_2_filtered.pcapng"
<> allPositional
)
-- myHandleParseResult :: ParserResult a -> m CMD.RetCode
-- myHandleParseResult (Success a) =
-- |Load a .csv file
cmdLoadCsv :: (Members '[Log, P.Trace, P.State MyState, Cache, Embed IO] m)
=> FilePath -- ^ csv file to load
-> Sem m CMD.RetCode
cmdLoadCsv csvFilename = do
P.trace $ "Loading " ++ csvFilename
frame <- liftIO $ loadRows csvFilename
-- TODO restore
-- loadedFile .= Just frame
P.modify (\s -> s { _loadedFile = Just frame })
Log.info $ "Number of rows " <> tshow (frameLength frame)
Log.debug "Frame loaded" >> return CMD.Continue