packages feed

algebra-sql-0.1.0.0: src/Database/Algebra/Table/Tools/DotGen.hs

-- | Debugging utility for table algebra plans. Takes a plan from the command
-- line or standard input and renders it into a GraphViz file.
module Main where

import System.Console.GetOpt
import System.Environment
import System.Exit
import System.IO

import Data.Maybe

import Data.ByteString.Lazy.Char8                (pack)

import Database.Algebra.Table.Render.Dot
import Database.Algebra.Table.Render.JSON

data Options = Options { optInput          :: IO String
                       , optRootNodes      :: Maybe [Int]
                       }

startOptions :: Options
startOptions = Options { optInput            = getContents
                       , optRootNodes        = Nothing
                       }

options :: [OptDescr (Options -> IO Options)]
options =
  [ Option "i" ["input"]
      (ReqArg (\arg opt -> return opt { optInput = readFile arg })
       "FILE")
      "Input file"
  , Option "n" ["rootnodes"]
      (ReqArg (\arg opt -> return opt { optRootNodes = Just $ read arg })
       "ROOTNODES")
      "List of root nodes to use (must be in Haskell list syntax)"
  , Option "h" ["help"]
      (NoArg
         (\_ -> do
             prg <- getProgName
             hPutStrLn stderr (usageInfo prg options)
             exitWith ExitSuccess))
      "Show help"
  ]

main :: IO ()
main = do
    args <- getArgs
    let (actions, _, _) = getOpt RequireOrder options args
    opts <- foldl (>>=) (return startOptions) actions
    let Options { optInput = input
                , optRootNodes = mRootNodes
                } = opts

    plan <- input

    let (tags, rs, m) = deserializePlan $ pack plan
        rs'           = fromMaybe rs mRootNodes 

    let dot = renderTADot tags rs' m

    putStr dot