flo-0.1: src/Main.hs
{-# LANGUAGE ViewPatterns #-}
-- | Generate a flow chart by scanning for annotations from a code base.
module Main where
import Control.Monad
import Data.List
import Data.Maybe
import Development.Flo
import System.Environment
import System.IO
import Text.Regex
-- | Main entry point.
main :: IO ()
main = do
args <- getArgs
let files = filter (not.opt) args
optish = filter opt args
opts = catMaybes (map parseOpt optish)
opt = isPrefixOf "-"
when (any (=="-v") optish) (hPrint stderr opts)
mapM (scanAndPrint opts) files >>= putStrLn.digraph.join.join
where scanAndPrint opts file =
fmap (either (error.show) (return.nodesToDot.declsToNodes))
(parseFile file start end)
where start = fromMaybe (error $ "No pattern specified for " ++ ext)
(lookup ext opts)
end = lookup (ext++"-end") opts
ext = reverse.takeWhile (/='.').reverse $ file
-- | Parse an -x=y option.
parseOpt :: String -> Maybe (String,String)
parseOpt (matchRegex (mkRegex "^-([a-zA-Z-]+)=(.+)$") -> Just [lang,start])
| all (not.null) [lang,start] = Just (lang,start)
parseOpt _ = Nothing