git.iko.soy/rowtype-yoga/purescript-native
on fa07667 help sign in
96 lines 2.9 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : Main
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- |
12--
13-----------------------------------------------------------------------------
15module Main where
17import qualified Language.PureScript as P
18import System.Console.CmdTheLine
19import Control.Applicative
20import Control.Monad (forM)
21import System.Exit (exitSuccess, exitFailure)
22import qualified System.IO.UTF8 as U
23import Text.Parsec (ParseError)
25readInput :: Maybe [FilePath] -> IO (Either ParseError [P.Module])
26readInput Nothing = getContents >>= return . P.runIndentParser P.parseModules
27readInput (Just input) = fmap (fmap concat . sequence) $ forM input $ \inputFile -> do
28 text <- U.readFile inputFile
29 return $ P.runIndentParser P.parseModules text
31compile :: P.Options -> Maybe [FilePath] -> Maybe FilePath -> Maybe FilePath -> IO ()
32compile opts input output externs = do
33 modules <- readInput input
34 case modules of
35 Left err -> do
36 U.print err
37 exitFailure
38 Right ms ->
39 case P.compile opts ms of
40 Left err -> do
41 U.putStrLn err
42 exitFailure
43 Right (js, exts, _) -> do
44 case output of
45 Just path -> U.writeFile path js
46 Nothing -> U.putStrLn js
47 case externs of
48 Nothing -> return ()
49 Just filePath -> U.writeFile filePath exts
50 exitSuccess
52useStdIn :: Term Bool
53useStdIn = value . flag $ (optInfo [ "s", "stdin" ])
54 { optDoc = "Read from standard input" }
56inputFiles :: Term [FilePath]
57inputFiles = value $ posAny [] $ posInfo
58 { posDoc = "The input .ps files" }
60outputFile :: Term (Maybe FilePath)
61outputFile = value $ opt Nothing $ (optInfo [ "o", "output" ])
62 { optDoc = "The output .js file" }
64externsFile :: Term (Maybe FilePath)
65externsFile = value $ opt Nothing $ (optInfo [ "e", "externs" ])
66 { optDoc = "The output .e.ps file" }
68tco :: Term Bool
69tco = value $ flag $ (optInfo [ "tco" ])
70 { optDoc = "Perform tail call optimizations" }
72performRuntimeTypeChecks :: Term Bool
73performRuntimeTypeChecks = value $ flag $ (optInfo [ "runtime-type-checks" ])
74 { optDoc = "Generate runtime type checks" }
76options :: Term P.Options
77options = P.Options <$> tco <*> performRuntimeTypeChecks
79stdInOrInputFiles :: Term (Maybe [FilePath])
80stdInOrInputFiles = combine <$> useStdIn <*> inputFiles
81 where
82 combine False input = Just input
83 combine True _ = Nothing
85term :: Term (IO ())
86term = compile <$> options <*> stdInOrInputFiles <*> outputFile <*> externsFile
88termInfo :: TermInfo
89termInfo = defTI
90 { termName = "psc"
91 , version = "1.0"
92 , termDoc = "Compiles PureScript to Javascript"
93 }
95main :: IO ()
96main = run (term, termInfo)