import Lexer
import Parser
import System.Environment
import System.Console.GetOpt
import ModuleMerger
import Validation
import ClassImplementer
import AST
import Data.List
import Data.Maybe
import Generator
import System.Directory
import Control.Monad
import System.IO
import Obfuscate
data Flag = Obfuscate deriving Eq
options :: [OptDescr Flag]
options = [
Option ['o'] ["obfuscate"] (NoArg Obfuscate) "obfuscated output"
]
header = "Usage: yesod-dsl FILE"
main = do
args <- getArgs
case getOpt RequireOrder options args of
(o, (path:_), []) -> main' o path
(_, _, msgs) -> error $ concat msgs ++ usageInfo header options
where
main' o path = do
dbs' <- parse path
let dbs = if Obfuscate `elem` o then obfuscate dbs' else dbs'
let ast = implementClasses . mergeModules $ dbs
let errors = validate ast
if null errors
then generate path $ ast
else hPutStrLn stderr errors