X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FEnvironment.hs;h=48105b4a6d2b840e43e2b87bb7ddedf51c2d4f4b;hb=8f77b5949ccd5f2272a02c852d51bfa2ecfa84c8;hp=881a9e69ef40fe3f8023fb81aafc80bb90f08b2f;hpb=03585f9c5773f6c0b59497f4f563909576c402b5;p=Rakka.git diff --git a/Rakka/Environment.hs b/Rakka/Environment.hs index 881a9e6..48105b4 100644 --- a/Rakka/Environment.hs +++ b/Rakka/Environment.hs @@ -1,68 +1,77 @@ module Rakka.Environment ( Environment(..) + , InterpTable , setupEnv - - , getSiteName - , getSiteNameA - - , getBaseURI - , getBaseURIA ) where -import Control.Arrow.ArrowIO -import qualified Data.ByteString.Char8 as C8 -import Data.Maybe +import Data.Map (Map) +import qualified Data.Map as M import Network import qualified Network.HTTP.Lucu.Config as LC -import Network.URI import Rakka.Storage +import Rakka.SystemConfig +import Rakka.Wiki.Interpreter +import qualified Rakka.Wiki.Interpreter.Base as Base +import qualified Rakka.Wiki.Interpreter.Image as Image +import qualified Rakka.Wiki.Interpreter.Outline as Outline +import Subversion.Repository +import System.Directory +import System.FilePath +import System.Log.Logger + +logger = "Rakka.Environment" data Environment = Environment { - envLocalStateDir :: FilePath - , envLucuConf :: LC.Config - , envStorage :: Storage + envLocalStateDir :: !FilePath + , envLucuConf :: !LC.Config + , envRepository :: !Repository + , envStorage :: !Storage + , envSysConf :: !SystemConfig + , envInterpTable :: !InterpTable } +type InterpTable = Map String Interpreter + + setupEnv :: FilePath -> PortNumber -> IO Environment setupEnv lsdir portNum - = do let lucuConf = LC.defaultConfig { - LC.cnfServerPort = PortNumber portNum - } - storage <- mkStorage -- FIXME + = do let lucuConf = LC.defaultConfig { + LC.cnfServerPort = PortNumber portNum + } + reposPath = lsdir `combine` "repos" + storage = mkStorage + interpTable = mkInterpTable + + reposExist <- doesDirectoryExist reposPath + repos <- if reposExist then + do debugM logger ("Found a subversion repository on " ++ reposPath) + openRepository reposPath + else + do noticeM logger ("Creating a subversion repository on " ++ reposPath) + createRepository reposPath [] [] + sysConf <- mkSystemConfig lucuConf repos + + return $ Environment { envLocalStateDir = lsdir , envLucuConf = lucuConf + , envRepository = repos , envStorage = storage + , envSysConf = sysConf + , envInterpTable = interpTable } -getSiteName :: Environment -> IO String -getSiteName env - = return "Rakka" -- FIXME - - -getSiteNameA :: ArrowIO a => Environment -> a b String -getSiteNameA = arrIO0 . getSiteName - - -getBaseURI :: Environment -> IO URI -getBaseURI env - = do let conf = envLucuConf env - host = C8.unpack $ LC.cnfServerHost conf - port = case LC.cnfServerPort conf of - PortNumber num -> fromIntegral num - - defaultURI - = "http://" ++ host ++ - (if port == 80 - then "" - else ':' : show port) ++ "/" - - return $ fromJust $ parseURI defaultURI -- FIXME - - -getBaseURIA :: ArrowIO a => Environment -> a b URI -getBaseURIA = arrIO0 . getBaseURI \ No newline at end of file +mkInterpTable :: InterpTable +mkInterpTable = listToTable $ + foldl (++) [] [ Base.interpreters + , Image.interpreters + , Outline.interpreters + ] + where + listToTable :: [Interpreter] -> InterpTable + listToTable xs + = M.fromList [ (commandName x, x) | x <- xs ]