module Helic.Net.Api where
import Servant (Get, JSON, NoContent (NoContent), PostCreated, PutAccepted, ReqBody, type (:<|>) ((:<|>)), type (:>))
import Servant.Server (Context (EmptyContext), ServerT)
import Helic.Data.Event (Event)
import qualified Helic.Data.NetConfig as NetConfig
import Helic.Data.NetConfig (NetConfig)
import qualified Helic.Effect.History as History
import Helic.Effect.History (History)
import Helic.Net.Server (ServerReady, runServerWithContext)
type Api =
"event" :> (
Get '[JSON] [Event]
:<|>
ReqBody '[JSON] Event :> PostCreated '[JSON] NoContent
:<|>
ReqBody '[JSON] Int :> PutAccepted '[JSON] (Maybe Event)
)
server ::
Member History r =>
ServerT Api (Sem r)
server :: forall (r :: EffectRow). Member History r => ServerT Api (Sem r)
server =
forall (r :: EffectRow). Member History r => Sem r [Event]
History.get
forall a b. a -> b -> a :<|> b
:<|>
(NoContent
NoContent <$) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: EffectRow). Member History r => Event -> Sem r ()
History.receive
forall a b. a -> b -> a :<|> b
:<|>
forall (r :: EffectRow).
Member History r =>
Int -> Sem r (Maybe Event)
History.load
defaultPort :: Int
defaultPort :: Int
defaultPort = Int
9500
serve ::
Members [History, Reader NetConfig, Sync ServerReady, Log, Interrupt, Final IO] r =>
Sem r ()
serve :: forall (r :: EffectRow).
Members
'[History, Reader NetConfig, Sync ServerReady, Log, Interrupt,
Final IO]
r =>
Sem r ()
serve = do
Maybe Int
port <- forall i j (r :: EffectRow).
Member (Reader i) r =>
(i -> j) -> Sem r j
asks (.port)
forall api (context :: [*]) (r :: EffectRow).
(HasServer api context,
HasContextEntry
(context .++ DefaultErrorFormatters) ErrorFormatters,
Members '[Sync ServerReady, Log, Interrupt, Final IO] r) =>
ServerT api (Sem r) -> Context context -> Int -> Sem r ()
runServerWithContext @Api forall (r :: EffectRow). Member History r => ServerT Api (Sem r)
server Context '[]
EmptyContext (forall a. a -> Maybe a -> a
fromMaybe Int
defaultPort Maybe Int
port)