api-maker-0.1.0.0: src/Network/HTTP/ApiMaker/SessionState.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
module Network.HTTP.ApiMaker.SessionState
( SessionState(..)
, Session(..)
, emptySession
) where
import Control.Lens
import qualified Data.ByteString.Char8 as B
import qualified Network.HTTP.Client as C
-- | Session state contract.
class SessionState st where
csrfToken :: Lens' st (Maybe B.ByteString)
sessionData :: Lens' st (Maybe B.ByteString)
cookieJarData :: Lens' st (Maybe C.CookieJar)
-- | Simple session state. This probably is sufficient for the day-to-day use.
data Session = Session
-- { unSession :: C.CookieJar } -- TODO: Does not work? Bug in req library?
{ sessCsrfToken :: Maybe B.ByteString
, sessSessionData :: Maybe B.ByteString
, sessCookieJarData :: Maybe C.CookieJar
} deriving (Show)
-- | Simple session state implemention.
instance SessionState Session where
csrfToken = lens sessCsrfToken (\sess c' -> sess {sessCsrfToken = c'})
sessionData = lens sessSessionData (\sess d' -> sess {sessSessionData = d'})
cookieJarData = lens sessCookieJarData (\sess d' -> sess {sessCookieJarData = d'})
-- | Empty session state.
emptySession :: Session
emptySession = Session Nothing Nothing Nothing