mirror of
https://github.com/srid/ema.git
synced 2024-11-29 09:25:14 +03:00
Parametrize SiteOutput
So that non-Asset outputs are possible (for composition).
This commit is contained in:
parent
83302865e1
commit
873c53fab9
@ -19,7 +19,7 @@ import Ema.Dynamic (Dynamic (Dynamic))
|
||||
import Ema.Generate (generateSiteFromModel)
|
||||
import Ema.Route.Class (IsRoute (RouteModel))
|
||||
import Ema.Server qualified as Server
|
||||
import Ema.Site (EmaSite (SiteArg, siteInput))
|
||||
import Ema.Site (EmaSite (SiteArg, siteInput), EmaStaticSite)
|
||||
import System.Directory (getCurrentDirectory)
|
||||
|
||||
{- | Run the given Ema site,
|
||||
@ -31,7 +31,7 @@ import System.Directory (getCurrentDirectory)
|
||||
-}
|
||||
runSite ::
|
||||
forall r.
|
||||
(Show r, Eq r, EmaSite r) =>
|
||||
(Show r, Eq r, EmaStaticSite r) =>
|
||||
-- | The input required to create the `Dynamic` of the `RouteModel`
|
||||
SiteArg r ->
|
||||
IO [FilePath]
|
||||
@ -46,7 +46,7 @@ runSite input = do
|
||||
pure fs
|
||||
|
||||
-- | Like @runSite@ but discards the result
|
||||
runSite_ :: forall r. (Show r, Eq r, EmaSite r) => SiteArg r -> IO ()
|
||||
runSite_ :: forall r. (Show r, Eq r, EmaStaticSite r) => SiteArg r -> IO ()
|
||||
runSite_ = void . runSite @r
|
||||
|
||||
{- | Like @runSite@ but takes the CLI action. Also returns more information.
|
||||
@ -57,7 +57,7 @@ runSite_ = void . runSite @r
|
||||
-}
|
||||
runSiteWithCli ::
|
||||
forall r.
|
||||
(Show r, Eq r, EmaSite r) =>
|
||||
(Show r, Eq r, EmaStaticSite r) =>
|
||||
CLI.Cli ->
|
||||
SiteArg r ->
|
||||
IO
|
||||
|
@ -22,7 +22,7 @@ import Ema.Route.Encoder (
|
||||
applyRouteEncoder,
|
||||
checkRouteEncoderGivenRoute,
|
||||
)
|
||||
import Ema.Site (EmaSite (siteOutput))
|
||||
import Ema.Site (EmaSite (siteOutput), EmaStaticSite)
|
||||
import Optics.Core (review)
|
||||
import System.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExist, doesFileExist, doesPathExist)
|
||||
import System.FilePath (takeDirectory, (</>))
|
||||
@ -37,7 +37,7 @@ log = logWithoutLoc "ema.generate"
|
||||
-}
|
||||
generateSiteFromModel ::
|
||||
forall r m.
|
||||
(MonadIO m, MonadLoggerIO m, MonadFail m, Eq r, Show r, IsRoute r, EmaSite r) =>
|
||||
(MonadIO m, MonadLoggerIO m, MonadFail m, Eq r, Show r, IsRoute r, EmaStaticSite r) =>
|
||||
-- | Target directory to write files to. Must exist.
|
||||
FilePath ->
|
||||
-- | The model data used to generate assets.
|
||||
@ -61,7 +61,7 @@ generateSiteFromModel dest model =
|
||||
-- | Like `generateSiteFromModel` but without buffering or error handling.
|
||||
generateSiteFromModel' ::
|
||||
forall r m.
|
||||
(MonadIO m, MonadLoggerIO m, MonadError Text m, Eq r, Show r, EmaSite r) =>
|
||||
(MonadIO m, MonadLoggerIO m, MonadError Text m, Eq r, Show r, EmaStaticSite r) =>
|
||||
FilePath ->
|
||||
RouteModel r ->
|
||||
-- | List of generated files.
|
||||
|
@ -6,7 +6,7 @@ module Ema.Route.Lib.Folder (
|
||||
import Data.Text qualified as T
|
||||
import Ema.Route.Class (IsRoute (..))
|
||||
import Ema.Route.Encoder (RouteEncoder, mapRouteEncoder)
|
||||
import Ema.Site (EmaSite (..))
|
||||
import Ema.Site (EmaSite (..), EmaStaticSite)
|
||||
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
|
||||
import Optics.Core (coercedTo, prism', (%))
|
||||
import System.FilePath ((</>))
|
||||
@ -24,7 +24,7 @@ instance (IsRoute r, KnownSymbol prefix) => IsRoute (FolderRoute prefix r) where
|
||||
routeEncoder = prefixRouteEncoder @prefix @r @(RouteModel r) $ routeEncoder @r
|
||||
allRoutes m = FolderRoute <$> allRoutes @r m
|
||||
|
||||
instance (EmaSite r, KnownSymbol prefix) => EmaSite (FolderRoute prefix r) where
|
||||
instance (EmaStaticSite r, KnownSymbol prefix) => EmaSite (FolderRoute prefix r) where
|
||||
type SiteArg (FolderRoute prefix r) = SiteArg r
|
||||
siteInput cliAct =
|
||||
siteInput @r cliAct
|
||||
|
@ -13,7 +13,7 @@ module Ema.Route.Lib.Multi (
|
||||
import Data.SOP (I (..), NP (..), NS (..))
|
||||
import Ema.Route.Class (IsRoute (..))
|
||||
import Ema.Route.Encoder
|
||||
import Ema.Site (EmaSite (..))
|
||||
import Ema.Site (EmaSite (..), EmaStaticSite)
|
||||
import Optics.Core (equality, iso, prism', (%))
|
||||
|
||||
{- | The merged site's route is represented as a n-ary sum (`NS`) of the
|
||||
@ -59,8 +59,8 @@ instance EmaSite (MultiRoute '[]) where
|
||||
siteOutput _ Nil = \case {}
|
||||
|
||||
instance
|
||||
( EmaSite r
|
||||
, EmaSite (MultiRoute rs)
|
||||
( EmaStaticSite r
|
||||
, EmaStaticSite (MultiRoute rs)
|
||||
, SiteArg (MultiRoute rs) ~ NP I (MultiSiteArg rs)
|
||||
, RouteModel (MultiRoute rs) ~ NP I (MultiModel rs)
|
||||
) =>
|
||||
|
@ -21,7 +21,7 @@ import Ema.Route.Encoder (
|
||||
checkRouteEncoderGivenFilePath,
|
||||
)
|
||||
import Ema.Route.Url (urlToFilePath)
|
||||
import Ema.Site (EmaSite (siteOutput))
|
||||
import Ema.Site (EmaSite (siteOutput), EmaStaticSite)
|
||||
import GHC.IO.Unsafe (unsafePerformIO)
|
||||
import NeatInterpolation (text)
|
||||
import Network.HTTP.Types qualified as H
|
||||
@ -45,7 +45,7 @@ runServerWithWebSocketHotReload ::
|
||||
, MonadLoggerIO m
|
||||
, Eq r
|
||||
, IsRoute r
|
||||
, EmaSite r
|
||||
, EmaStaticSite r
|
||||
) =>
|
||||
Host ->
|
||||
Maybe Port ->
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
module Ema.Site (
|
||||
EmaSite (..),
|
||||
EmaStaticSite,
|
||||
) where
|
||||
|
||||
import Control.Monad.Logger (MonadLoggerIO)
|
||||
@ -42,6 +43,9 @@ class IsRoute r => EmaSite r where
|
||||
-- By default Ema sites have no site arguments.
|
||||
type SiteArg r = ()
|
||||
|
||||
type SiteOutput r :: Type
|
||||
type SiteOutput r = Asset LByteString
|
||||
|
||||
{- Get the model's time-varying value as a `Dynamic`.
|
||||
|
||||
If your model is not time-varying, use `pure` to produce a constant value.
|
||||
@ -59,4 +63,6 @@ class IsRoute r => EmaSite r where
|
||||
m (Dynamic m (RouteModel r))
|
||||
|
||||
-- | Return the generated asset for the given route and model.
|
||||
siteOutput :: Prism' FilePath r -> RouteModel r -> r -> Asset LByteString
|
||||
siteOutput :: Prism' FilePath r -> RouteModel r -> r -> SiteOutput r
|
||||
|
||||
type EmaStaticSite r = (EmaSite r, SiteOutput r ~ Asset LByteString)
|
||||
|
Loading…
Reference in New Issue
Block a user