96 lines
2.6 KiB
Haskell
96 lines
2.6 KiB
Haskell
|
|
||
|
{-
|
||
|
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
|
||
|
|
||
|
)
|