module Main
( main
) where
import Protolude
import qualified Data.Text as T
import Ethereum.Analyzer.Debug
import Ethereum.Analyzer.Solidity hiding (value)
import Options.Applicative
import Options.Applicative.Text
data AnalyzeFlags = AnalyzeFlags
{ astJson :: Text
, debug :: Bool
} deriving (Eq, Show)
analyzeFlags :: Parser AnalyzeFlags
analyzeFlags =
AnalyzeFlags <$>
textOption
(long "astJson" <> value "" <> metavar "PATH" <>
help "Path to the ast-json file.") <*>
switch (long "debug" <> help "Whether to print debug info")
main :: IO ()
main = analyze =<< execParser opts
where
opts =
info
(analyzeFlags <**> helper)
(fullDesc <>
progDesc (toS ("Analyze the contract specified at PATH" :: Text)) <>
header
(toS ("ea-analyze - CLI interface for ethereum-analyzer" :: Text)))
analyze :: AnalyzeFlags -> IO ()
analyze flags@AnalyzeFlags {astJson = theAstJson, debug = debug} = do
when debug $ putText $ show flags
content <-
if (theAstJson == "" || theAstJson == "-")
then getContents
else readFile $ toS theAstJson
case decodeContracts content of
Right contracts -> do
when debug $ pprintContracts contracts
putText "Findings: \n"
putText ("\n" `T.intercalate` concatMap findingsFor contracts)
Left err -> putText err
return ()