cake3-0.3.0.0: src/Development/Cake3/Ext/UrWeb/UrEmbed.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecursiveDo #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ImpredicativeTypes #-}
module Main where
import Control.Monad.Error
import Control.Monad.State
import Control.Monad.Writer
import Data.Either
import Data.Generics
import Data.Char
import Data.List
import Data.Data
import Data.Typeable
import Data.Maybe
import Data.String
-- import qualified Data.Text as T
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as BS
import Language.JavaScript.Parser
import Options.Applicative
import System.Environment
import System.Process
import System.Exit
import System.IO
-- import System.FilePath
import System.Directory
import System.Info
import Text.Printf
import Development.Cake3
import Development.Cake3.Ext.UrWeb
import Paths_cake3
io :: (MonadIO m) => IO a -> m a
io = liftIO
hio :: (MonadIO m) => Handle -> String -> m ()
hio h = io . hPutStrLn h
err,out :: (MonadIO m) => String -> m ()
err = hio stderr
out = hio stdout
data Args = A
{ tgtdir :: FilePath
, fversion :: Bool
, dontrunmake :: Bool
, files :: [FilePath]
}
pargs :: Parser Args
pargs = A
<$> strOption
( long "output"
<> short 'o'
<> metavar "FILE.urp"
<> help "Name of the Ur/Web project being generated"
<> value "")
<*> flag False True ( long "version" <> help "Show version information" )
<*> flag False True ( long "dont-run-make" <> help "Do not run the makefile generated" )
<*> arguments str ( metavar "FILE" <> help "File to embed" )
main :: IO ()
main = do
h <- (getDataFileName >=> readFile) "UrEmbedHelp.txt"
main_ =<< execParser (
info (helper <*> pargs)
( fullDesc
<> progDesc h
<> header "UrEmebed is the Ur/Web module generator" ))
main_ (A tgturp True drm ins) = do
hPutStrLn stderr $ "urembed version " ++ (show version)
main_ (A tgturp False drm ins) = do
let tgtdir = takeDirectory tgturp
when (null tgtdir) $ do
fail "An output directory should be specified, use -o"
when (null ins) $ do
fail "At least one file should be specified, see --help"
exists <- doesDirectoryExist tgtdir
when (not exists) $ do
fail $ "Couldn't create output file, no such directory " ++ show tgtdir
when (null tgtdir) $ do
fail "An output directory should be specified, use -o"
when (null ins) $ do
fail "At least one file should be specified, see --help"
exists <- doesDirectoryExist tgtdir
when (not exists) $ do
fail "Output is not a directory"
cntnts <- mapM BS.readFile ins
setCurrentDirectory tgtdir
loc <- currentDirLocation
let file = file' loc
let bin = bin' (file ".")
let mk = (("." </> takeFileName tgturp) .= "mk")
writeMake (file mk) $ do
let urp = file (takeFileName tgturp)
u <- uwlib urp $ do
forM_ (ins`zip`cntnts) $ \(i,c) -> do
bin i c
rule $ do
phony "all"
depend u
when (drm == False) $ do
system $ printf "make -f %s" mk
return ()