git.iko.soy/rowtype-yoga/purescript-native
on 667eeef help sign in
71 lines 2.1 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 PureScript
18import Data.Maybe (mapMaybe)
19import Data.List (intercalate)
20import System.Console.CmdTheLine
21import Control.Applicative
22import System.Exit (exitSuccess, exitFailure)
23import qualified System.IO.UTF8 as U
24import qualified Data.Map as M
26compile :: [FilePath] -> Maybe FilePath -> Maybe FilePath -> IO ()
27compile inputFiles outputFile externsFile = do
28 input <- fmap concat $ mapM U.readFile inputFiles
29 let ast = parseDeclarations input
30 case ast of
31 Left err -> do
32 U.print err
33 exitFailure
34 Right decls -> do
35 case check (typeCheckAll decls) of
36 Left typeError -> do
37 U.putStrLn typeError
38 exitFailure
39 Right (_, env) -> do
40 let js = intercalate "\n" $ mapMaybe declToJs decls
41 case outputFile of
42 Just path -> U.writeFile path js
43 Nothing -> U.putStrLn js
44 case externsFile of
45 Nothing -> return ()
46 Just filePath -> U.writeFile filePath $ intercalate "\n\n" $ map externToJs $ M.toList $ names env
47 exitSuccess
49inputFiles :: Term [FilePath]
50inputFiles = nonEmpty $ posAny [] $ posInfo
51 { posDoc = "The input .ps files" }
53outputFile :: Term (Maybe FilePath)
54outputFile = value $ opt Nothing $ (optInfo [ "o", "output" ])
55 { optDoc = "The output .js file" }
57externsFile :: Term (Maybe FilePath)
58externsFile = value $ opt Nothing $ (optInfo [ "e", "externs" ])
59 { optDoc = "The output .e.ps file" }
61term :: Term (IO ())
62term = compile <$> inputFiles <*> outputFile <*> externsFile
64termInfo :: TermInfo
65termInfo = defTI
66 { termName = "psc"
67 , version = "1.0"
68 , termDoc = "Compiles PureScript to Javascript"
69 }
71main = run (term, termInfo)