{- |
 Handlers for serving static resources
-}
module WebGear.Core.Handler.Static (
  serveStatic,
) where

import Control.Arrow (returnA)
import Network.Wai (Request (..))
import qualified Network.Wai.Application.Static as Wai.Static
import WebGear.Core.Handler (Handler (..), RequestHandler, RoutePath (..))
import WebGear.Core.Request (toWaiRequest)
import WebGear.Core.Response (Response (ResponseCont))
import WebGear.Core.Trait (unwitness)
import Prelude hiding (readFile)

-- | Serve static assets
serveStatic :: (Handler h m) => Wai.Static.StaticSettings -> RequestHandler h ts
serveStatic :: forall (h :: * -> * -> *) (m :: * -> *) (ts :: [*]).
Handler h m =>
StaticSettings -> RequestHandler h ts
serveStatic StaticSettings
settings =
  proc With Request ts
request -> do
    RoutePath [Text]
pathInfo <- h RoutePath RoutePath -> h () RoutePath
forall a. h RoutePath a -> h () a
forall (h :: * -> * -> *) (m :: * -> *) a.
Handler h m =>
h RoutePath a -> h () a
consumeRoute h RoutePath RoutePath
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< ()
    let waiRequest :: Request
waiRequest = Request -> Request
toWaiRequest (Request -> Request) -> Request -> Request
forall a b. (a -> b) -> a -> b
$ With Request ts -> Request
forall a (ts :: [*]). With a ts -> a
unwitness With Request ts
request
    h Response Response
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< ((Response -> IO ResponseReceived) -> IO ResponseReceived)
-> Response
ResponseCont (((Response -> IO ResponseReceived) -> IO ResponseReceived)
 -> Response)
-> ((Response -> IO ResponseReceived) -> IO ResponseReceived)
-> Response
forall a b. (a -> b) -> a -> b
$ StaticSettings -> Application
Wai.Static.staticApp StaticSettings
settings Request
waiRequest{pathInfo}