packages feed

couch-hs-0.1.1: source/Database/CouchDB/ViewServer/Main/Devel.hs

module Database.CouchDB.ViewServer.Main.Devel
    ( runCompileMapFuncs
    , runCompileReduceFuncs
    ) where


import System.IO
import System.Exit
import Data.Either
import qualified Data.ByteString.Lazy as L
import Data.Aeson
import Language.Haskell.Interpreter

import Database.CouchDB.ViewServer.Main.Context
import Database.CouchDB.ViewServer.Map
import Database.CouchDB.ViewServer.Reduce


runCompileMapFuncs :: Context -> IO ExitCode
runCompileMapFuncs context = runCompileFuncs context (ctxMapFuncInterpreter context)


runCompileReduceFuncs :: Context -> IO ExitCode
runCompileReduceFuncs context = runCompileFuncs context (ctxReduceFuncInterpreter context)


runCompileFuncs :: Context -> (String -> Interpreter a) -> IO ExitCode
runCompileFuncs context interpreter = do
    sources <- loadSources $ ctxArgs context
    eitherFuncs <- mapM (runInterpreter . interpreter) sources
    printResults $ zip sources eitherFuncs

    if null $ lefts eitherFuncs
        then return ExitSuccess
        else return (ExitFailure 1)


{-
    Returns at least one string to compile. Arguments are either raw source
    code, which is returned unmodified, or prefixed by '@', which indicates a
    path to read from. If no arguments are given, we return the contents of
    stdin.
-}
loadSources :: [String] -> IO [String]
loadSources args =
    case args of
        [] -> mapM hGetContents [stdin]
        _  -> mapM loadSource args
    where
        loadSource arg = case arg of
            ('@':path) -> readFile path
            _          -> return arg


printResults :: [(String, Either InterpreterError a)] -> IO ()
printResults = mapM_ printResult
    where
        printResult (_, Left err)     = printInterpreterError err
        printResult (source, Right _) = putStrLn "OK" -- L.putStrLn $ encode $ toJSON source


printInterpreterError :: InterpreterError -> IO ()
printInterpreterError (UnknownError s) = putStrLn s
printInterpreterError (WontCompile ss) = mapM_ (putStrLn . errMsg) ss
printInterpreterError (NotAllowed s)   = putStrLn s
printInterpreterError (GhcException s) = putStrLn s