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 > )