-- ConstraintKinds needed only for 7.8.4
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Main (main) where
import Data.Maybe
(fromMaybe)
import Lucid
import Lucid.Servant
import Network.Wai
(Application)
import Servant
import Servant.HTML.Lucid
import System.Environment
(getArgs, lookupEnv)
import Text.Read
(readMaybe)
import qualified Network.Wai.Handler.Warp as Warp
type API = "string" :> Get '[HTML] String
:<|> "nested" :> "html" :> Get '[HTML] (Html ())
api :: Proxy API
api = Proxy
apiLink_
:: (IsElem endpoint API, HasLink endpoint)
=> Proxy endpoint -> MkLink endpoint Attribute
apiLink_ = safeAbsHref_ (Proxy :: Proxy API)
stringLink_ :: Attribute
stringLink_ = apiLink_ (Proxy :: Proxy ("string" :> Get '[HTML] String))
server :: Server API
server = return "example" :<|> return html where
html :: Html ()
html = do
p_ $ b_ "bar"
p_ $ i_ "iik"
p_ $ a_ [stringLink_] "string"
app :: Application
app = serve api server
main :: IO ()
main = do
args <- getArgs
case args of
("run":_) -> do
port <- fmap (fromMaybe 8000 . (>>= readMaybe)) (lookupEnv "PORT")
putStrLn $ "http://localhost:" ++ show port ++ "/"
Warp.run port app
_ -> do
putStrLn "Example application, used as a compilation check"
putStrLn "To run, pass run argument: --test-arguments run"