packages feed

hascat-0.2: Main.hs

module Main where

import Control.Concurrent.MVar
import Control.OldException as Exception
import Control.Monad
import Hascat.App
import Hascat.Config
import Hascat.System.App
import Hascat.System.Controller
import Prelude hiding ( log )
import System.Environment
import System.Posix.Process
import System.Posix.Types

import ConfigReader
import HttpImpl
import Logger


main :: IO ()
main = do
  configFile <- parseArgs
  config <- readConfig configFile
  stateVar <- createState config
  startServer stateVar


parseArgs :: IO FilePath
parseArgs = do
  args <- getArgs
  case args of
    [configFile] -> return configFile
    _            -> error "hascat <config-file>"


createState :: Config -> IO StateVar
createState (Config _ general (AppController appConfigs)) = do
  processID <- getProcessID
  let state = (State processID general [])
  stateVar <- newEmptyMVar
  putMVar stateVar state
  --foldM  :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
  --foldr  ::            (a -> b -> b) -> b -> [a] -> b
  foldM_ loadApp' stateVar appConfigs
  state' <- readMVar stateVar
  foldM startApp' stateVar (map appConfig (stApps state'))
  --return stateVar
  where
    loadApp' :: StateVar -> AppConfig -> IO StateVar
    loadApp' stateVar config = do
      Exception.catch
        (do log ("Installing \"" ++ getAppName config ++ "\""
                 ++ " at " ++ (show $ getAppContextPath config))
            loadApp stateVar config >> return stateVar)
        (\e -> log (show e) >> return stateVar)

    startApp' :: StateVar -> AppConfig -> IO StateVar
    startApp' stateVar config =
        if (getAppAutoStart config == AppConfig_autoStart_yes
              || getAppType config == AppConfig_type_system) then
          do
            --state <- takeMVar stateVar
            Exception.catch
              (do 
                log ("Starting \"" ++ getAppName config ++ "\""
                  ++ " at " ++ (show $ getAppContextPath config))
                startApp stateVar (getAppContextPath config)
--                putMVar stateVar state'
                return stateVar)
              (\e -> log (show e)  >> return stateVar)
        else
          return stateVar