{- |
Copyright: 2006, Bjorn Bringert
Copyright: 2009, Henning Thielemann
-}
module Network.MoHWS.Initialization.Standard (Extension, init, ) where

import qualified Network.MoHWS.Module.Description as ModuleDesc
import qualified Network.MoHWS.Initialization as Init
import qualified Network.MoHWS.Stream as Stream
import qualified Data.Accessor.Basic as Accessor

import qualified Network.MoHWS.Part.UserDirectory as UserDir
import qualified Network.MoHWS.Part.VirtualHost   as VirtualHost
import qualified Network.MoHWS.Part.AddSlash      as AddSlash
import qualified Network.MoHWS.Part.Index         as Index
import qualified Network.MoHWS.Part.CGI           as CGI
import qualified Network.MoHWS.Part.File          as File
import qualified Network.MoHWS.Part.Listing       as Listing

import Prelude hiding (init, )


data Extension =
   Extension {
      userDir     :: UserDir.Configuration,
      virtualHost :: VirtualHost.Configuration,
      addSlash    :: AddSlash.Configuration,
      index       :: Index.Configuration,
      cgi         :: CGI.Configuration,
      file        :: File.Configuration,
      listing     :: Listing.Configuration
   }

lift ::
   (partExt -> fullExt -> fullExt) -> (fullExt -> partExt) ->
   ModuleDesc.T body partExt -> ModuleDesc.T body fullExt
lift set get =
   ModuleDesc.lift (Accessor.fromSetGet set get)

moduleList :: (Stream.C body) => [ModuleDesc.T body Extension]
moduleList =
   lift (\x ext -> ext{userDir     = x}) userDir     UserDir.desc :
   lift (\x ext -> ext{virtualHost = x}) virtualHost VirtualHost.desc :
   lift (\x ext -> ext{addSlash    = x}) addSlash    AddSlash.desc :
   lift (\x ext -> ext{index       = x}) index       Index.desc :
   lift (\x ext -> ext{cgi         = x}) cgi         CGI.desc :
   lift (\x ext -> ext{file        = x}) file        File.desc :
   lift (\x ext -> ext{listing     = x}) listing     Listing.desc :
   []

init :: (Stream.C body) => Init.T body Extension
init =
   Init.Cons {
      Init.moduleList = moduleList,
      Init.configurationExtensionDefault =
         Extension
            (error "uninitialized userDir extension")
            (error "uninitialized virtualHost extension")
            (error "uninitialized addSlash extension")
            (error "uninitialized index extension")
            (error "uninitialized cgi extension")
            (error "uninitialized file extension")
            (error "uninitialized listing extension")
   }