module GFC (mainGFC) where -- module Main where import GF.Compile import GF.GFCC.PrintGFCC import GF.GFCC.CId import GF.GFCC.DataGFCC import GF.GFCC.Raw.ParGFCCRaw import GF.GFCC.Raw.ConvertGFCC import GF.Infra.UseIO import GF.Infra.Option import GF.GFCC.API import GF.Data.ErrM import Data.Maybe import System.FilePath mainGFC :: Options -> [FilePath] -> IOE () mainGFC opts fs = do gr <- batchCompile opts fs let cnc = justModuleName (last fs) if flag optStopAfterPhase opts == Compile then return () else do gfcc <- link opts cnc gr writeOutputs opts gfcc writeOutputs :: Options -> GFCC -> IOE () writeOutputs opts gfcc = mapM_ (\fmt -> writeOutput opts fmt gfcc) (flag optOutputFormats opts) writeOutput :: Options -> OutputFormat-> GFCC -> IOE () writeOutput opts fmt gfcc = do let path = outputFilePath opts fmt (prCId (absname gfcc)) s = prGFCC fmt gfcc writeOutputFile path s outputFilePath :: Options -> OutputFormat -> String -> FilePath outputFilePath opts fmt name0 = addDir name <.> fmtExtension fmt where name = fromMaybe name0 (moduleFlag optName opts) addDir = maybe id () (flag optOutputDir opts) fmtExtension :: OutputFormat -> String fmtExtension FmtGFCC = "gfcc" fmtExtension FmtJavaScript = "js" fmtExtension FmtHaskell = "hs" fmtExtension FmtHaskellGADT = "hs" writeOutputFile :: FilePath -> String -> IOE () writeOutputFile outfile output = ioeIO $ do writeFile outfile output putStrLn $ "wrote file " ++ outfile