module TsWeb.Routing.Clay
( clay
) where
import qualified TsWeb.Routing as R
import TsWeb.Types (TsSpockCtxT)
import TsWeb.Types.Db (ReadWritePool)
import qualified SuperRecord as SR
import qualified Web.Spock as Spock
import Clay (Css, pretty, renderWith)
import Crypto.Hash (Blake2b_160, Digest, hash)
import Data.Monoid ((<>))
import Data.Text.Encoding (encodeUtf8)
import Data.Text.Lazy (toStrict)
import GHC.TypeLits (type (-), KnownNat, KnownSymbol)
import SuperRecord ((:=)(..), FldProxy, Rec, Record, Sort)
import Web.Routing.Combinators (PathState(Open))
import Web.Spock (Path, (<//>))
clay ::
( SR.KeyDoesNotExist l lts
, SR.RecCopy lts lts (Sort (l := (Path '[] 'Open) : lts))
, KnownNat (SR.RecSize lts)
, (KnownNat ((SR.RecSize (Sort (l := Path '[] 'Open : lts)) - SR.RecTyIdxH 0 l (Sort (l := Path '[] 'Open : lts))) - 1))
, KnownSymbol l
)
=> FldProxy l
-> String
-> Css
-> (ReadWritePool, Rec lts, TsSpockCtxT lts0 xs sess ())
-> ( ReadWritePool
, Record (l := (Path '[] 'Open) : lts)
, TsSpockCtxT lts0 xs sess ())
clay l base css =
let sheet = toStrict $ renderWith pretty [] css <> "\n"
dgst = hash (encodeUtf8 sheet) :: Digest Blake2b_160
url = Spock.static base <//> Spock.static (show dgst ++ ".css")
in R.path l url (R.get $ Spock.text sheet)