import Lexer
import Parser
import System.Environment
import System.Console.GetOpt
import ModuleMerger
import Validation
import ClassImplementer
import Generator
import Control.Monad
import System.IO
import ExpandMacros
data Flag =
FayPath String deriving Eq
options :: [OptDescr Flag]
options = [
Option ['f'] ["fay"] (ReqArg FayPath "FILE") "translate DSL definition to Fay compatible code and store it in FILE"
]
header :: String
header = "Usage: yesod-dsl FILE"
main :: IO ()
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 ast = expandMacros . implementClasses . mergeModules $ dbs
let errors = validate ast
if null errors
then do
generate path $ ast
forM_ o (processFlag ast)
else hPutStrLn stderr errors
processFlag ast (FayPath path) = genFay path ast
processFlag _ _ = return ()