{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NamedFieldPuns #-}
module Main
( main
) where
import Args
import Memo
import JSDict
import JSDictDef
import Standalone
import Snap.Core
import Snap.Http.Server (httpServe)
import Snap.Http.Server.Config
import Snap.Util.FileServe (getSafePath, serveDirectoryWith, simpleDirectoryConfig)
import Data.ByteString.UTF8 (fromString, toString)
import System.FilePath
import Control.Applicative ((<|>))
import Control.Monad
import Control.Monad.Trans
---------------------------------------------------------------
main :: IO ()
main = getArgs >>= mainWithArgs
mainWithArgs :: Args -> IO ()
mainWithArgs (Args {sourcedir, port, datadir, includedir, logdir}) = do
putStrLn $ "Working directory: " ++ show sourcedir
putStrLn $ "Include directories: " ++ show includedir
let -- includedirs = ["", "/home/divip/share/agda/std-lib/src"]
templatepath = datadir </> "agda.template"
jsfile = datadir </> "common.js"
let ((common, definitions), idC) = runJSDictM $ jsDictM includedir
runMemo <- initMemo idC
ht <- liftIO $ readFile templatepath
let serveHtml = do
p <- getSafePath
guard $ takeExtension p `elem` [".xml"]
return $ standalone ht common sourcedir $ dropExtension p
runSM name i fun = do
mn <- getParam' "sm"
guard $ name == mn
fmap fun $ mapM (getParam' . ('v':) . show) [1..i]
writeFile jsfile $ unlines [x | JSDef x <- definitions]
httpServe
( setPort port
. setAccessLog (if null logdir then ConfigNoLog else ConfigFileLog (logdir </> "access.log"))
. setErrorLog (if null logdir then ConfigNoLog else ConfigFileLog (logdir </> "error.log"))
$ emptyConfig
)
( method GET
( (writeBS . fromString =<< runMemo =<< serveHtml)
<|> serveDirectoryWith simpleDirectoryConfig datadir
<|> serveDirectoryWith simpleDirectoryConfig sourcedir
)
<|> method POST
( ( writeBS . fromString =<< runMemo =<<
msum [runSM name i fun | SMDef name i fun <- definitions]
)
<|> writeBS "Invalid post request"
)
<|> writeBS "Not found. Try to find X.xml for example."
)
getParam' :: String -> Snap String
getParam' t = do
Just x <- getParam $ fromString t
return $ toString x