import qualified Data.ByteString.Builder as BSB import qualified Data.ByteString.Lazy as BSL import Data.Foldable (for_) import qualified Data.List as List import qualified System.Directory as Dir import System.Environment import System.IO import Graph.Trace.Dot (buildGraph, graphToDot, parseLogEntries) main :: IO () main = do args <- getArgs traceFiles <- case args of [] -> do contents <- Dir.listDirectory =<< Dir.getCurrentDirectory let isTraceFile = (".trace" `List.isSuffixOf`) pure $ filter isTraceFile contents xs -> pure xs for_ traceFiles $ \traceFile -> do logContents <- either (\err -> fail $ "Failed parsing trace file: " <> err) id . parseLogEntries <$> BSL.readFile traceFile let dotFileContent = graphToDot $ buildGraph logContents fileName = (<> ".dot") $ if ".trace" `List.isSuffixOf` traceFile then reverse . drop 6 $ reverse traceFile else traceFile withFile fileName WriteMode $ \h -> do hSetBinaryMode h True hSetBuffering h (BlockBuffering Nothing) BSB.hPutBuilder h dotFileContent