{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
module Admin.Component.Health
( HealthAPI
, HealthComponent
, health
, serveHealth
, Control.Concurrent.Async.async
, Control.Concurrent.Async.Async
) where
import Admin.Components
import Control.Concurrent.Async (Async, async)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.ApplicationState
import Data.Version (makeVersion)
import Servant.API
type HealthAPI = "status" :> Get '[ JSON] ApplicationState
type HealthComponent = Component "health" HealthAPI
health :: (Show a) => Async a -> HealthComponent
health as = Component {server = serveHealth as, version = makeVersion [1]}
serveHealth :: (MonadIO m, Show a) => Async a -> m ApplicationState
serveHealth as = liftIO $ stateOf as