module ApiTypes where
import CssContentType
-import Html
import Lucid
import Servant
import Servant.HTML.Lucid (HTML(..))
import qualified Clay as C
+import qualified Data.Text as T
type Api = Page :<|> Themes
type Page = MainPage :<|> BlogPost
type LightTheme = "style" :> "light" :> QueryParam "red" Integer :> QueryParam "green" Integer :> QueryParam "blue" Integer :> Get '[CSS] C.Css
type ThemeParam = QueryParam "theme" Theme
+type BlogId = FilePath
+
+data LightDark = Light | Dark deriving (Eq)
+
+instance FromHttpApiData LightDark where
+ parseQueryParam "0" = Right Dark
+ parseQueryParam "1" = Right Light
+ parseQueryParam x = Left $ "Invalid value " <> x <> ". Value must be either '0' or '1'."
+
+instance ToHttpApiData LightDark where
+ toQueryParam Dark = "0"
+ toQueryParam Light = "1"
+
+data Theme = Theme { themeType :: !LightDark
+ , themeRed :: !Integer
+ , themeGreen :: !Integer
+ , themeBlue :: !Integer
+ }
+
+instance FromHttpApiData Theme where
+ parseQueryParam theme = do
+ case T.splitOn "," theme of
+ [lightText, redText, greenText, blueText] -> do
+ light <- parseQueryParam lightText
+ red <- parseQueryParam redText
+ green <- parseQueryParam greenText
+ blue <- parseQueryParam blueText
+ pure $ Theme { themeType = light, themeRed = red, themeGreen = green, themeBlue = blue }
+ _ -> Left $ "Invalid value '" <> theme <> "'. Value must contain four integer values delimited by commas."
+
+instance ToHttpApiData Theme where
+ toQueryParam theme = toQueryParam (themeType theme) <> "," <> toQueryParam (themeRed theme) <> "," <> toQueryParam (themeGreen theme) <> "," <> toQueryParam (themeBlue theme)
+
apiProxy :: Proxy Api
apiProxy = Proxy
module Html where
+import ApiTypes
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO(..), liftIO)
import Data.Maybe (fromMaybe)
import qualified Data.Text as T
import qualified Data.Text.IO as T
-data LightDark = Light | Dark deriving (Eq)
-
-instance FromHttpApiData LightDark where
- parseQueryParam "0" = Right Dark
- parseQueryParam "1" = Right Light
- parseQueryParam x = Left $ "Invalid value " <> x <> ". Value must be either '0' or '1'."
-
-instance ToHttpApiData LightDark where
- toQueryParam Dark = "0"
- toQueryParam Light = "1"
-
-data Theme = Theme { themeType :: !LightDark
- , themeRed :: !Integer
- , themeGreen :: !Integer
- , themeBlue :: !Integer
- }
-
-instance FromHttpApiData Theme where
- parseQueryParam theme = do
- case T.splitOn "," theme of
- [lightText, redText, greenText, blueText] -> do
- light <- parseQueryParam lightText
- red <- parseQueryParam redText
- green <- parseQueryParam greenText
- blue <- parseQueryParam blueText
- pure $ Theme { themeType = light, themeRed = red, themeGreen = green, themeBlue = blue }
- _ -> Left $ "Invalid value '" <> theme <> "'. Value must contain four integer values delimited by commas."
-
-instance ToHttpApiData Theme where
- toQueryParam theme = toQueryParam (themeType theme) <> "," <> toQueryParam (themeRed theme) <> "," <> toQueryParam (themeGreen theme) <> "," <> toQueryParam (themeBlue theme)
-
-type BlogId = FilePath
-
htmlContainer :: (MonadIO m) => Maybe Theme -> Html a -> m (Html ())
htmlContainer theme contents = do
nav <- navigation theme