1
Fork 0
simple-sql-parser/tools/SimpleSqlParserTool.hs

96 lines
2.6 KiB
Haskell
Raw Normal View History

{-
Simple command line tool to experiment with simple-sql-parser
Commands:
parse: parse sql from file, stdin or from command line
lex: lex sql same
indent: parse then pretty print sql
-}
{-# LANGUAGE TupleSections #-}
import System.Environment
import Control.Monad
import Data.Maybe
import System.Exit
import Data.List
import Text.Show.Pretty
--import Control.Applicative
import Language.SQL.SimpleSQL.Pretty
import Language.SQL.SimpleSQL.Parse
import Language.SQL.SimpleSQL.Lex
main :: IO ()
main = do
args <- getArgs
case args of
[] -> do
showHelp $ Just "no command given"
(c:as) -> do
let cmd = lookup c commands
maybe (showHelp (Just "command not recognised"))
(\(_,cmd') -> cmd' as)
cmd
commands :: [(String, (String,[String] -> IO ()))]
commands =
[("help", helpCommand)
,("parse", parseCommand)
,("lex", lexCommand)
,("indent", indentCommand)]
showHelp :: Maybe String -> IO ()
showHelp msg = do
maybe (return ()) (\e -> putStrLn $ "Error: " ++ e) msg
putStrLn "Usage:\n SimpleSqlParserTool command args"
forM_ commands $ \(c, (h,_)) -> do
putStrLn $ c ++ "\t" ++ h
when (isJust msg) $ exitFailure
helpCommand :: (String,[String] -> IO ())
helpCommand =
("show help for this progam", \_ -> showHelp Nothing)
getInput :: [String] -> IO (FilePath,String)
getInput as =
case as of
["-"] -> ("",) <$> getContents
("-c":as') -> return ("", unwords as')
[filename] -> (filename,) <$> readFile filename
_ -> showHelp (Just "arguments not recognised") >> error ""
parseCommand :: (String,[String] -> IO ())
parseCommand =
("parse SQL from file/stdin/command line (use -c to parse from command line)"
,\args -> do
(f,src) <- getInput args
either (error . peFormattedError)
(putStrLn . ppShow)
$ parseStatements ansi2011 f Nothing src
)
lexCommand :: (String,[String] -> IO ())
lexCommand =
("lex SQL from file/stdin/command line (use -c to parse from command line)"
,\args -> do
(f,src) <- getInput args
either (error . peFormattedError)
(putStrLn . intercalate ",\n" . map show)
$ lexSQL ansi2011 f Nothing src
)
indentCommand :: (String,[String] -> IO ())
indentCommand =
("parse then pretty print SQL from file/stdin/command line (use -c to parse from command line)"
,\args -> do
(f,src) <- getInput args
either (error . peFormattedError)
(putStrLn . prettyStatements ansi2011)
$ parseStatements ansi2011 f Nothing src
)