mirror of
https://github.com/ilyakooo0/roboservant.git
synced 2024-11-25 11:15:45 +03:00
42 lines
998 B
Haskell
42 lines
998 B
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE DeriveGeneric #-}
|
|
{-# LANGUAGE DerivingStrategies #-}
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE TypeOperators #-}
|
|
|
|
module UnsafeIO where
|
|
|
|
import Data.Aeson()
|
|
import Servant
|
|
import Data.IORef (writeIORef, IORef, readIORef, newIORef)
|
|
import Control.Monad.Trans (MonadIO(liftIO))
|
|
import qualified Data.ByteString.Lazy.Char8 as BL8
|
|
|
|
|
|
type UnsafeApi =
|
|
"add" :> Get '[JSON] ()
|
|
:<|> "healthcheck" :> Get '[JSON] ()
|
|
|
|
healthcheck :: IORef Int -> Handler ()
|
|
healthcheck ref = do
|
|
t <- liftIO $ readIORef ref
|
|
case t of
|
|
0 -> pure ()
|
|
n -> throwError $ err500 {errBody = "observed inconsistency: " <> (BL8.pack $ show n)}
|
|
|
|
|
|
|
|
makeServer :: IO (Server UnsafeApi)
|
|
makeServer = do
|
|
ref <- newIORef 0
|
|
pure $ unsafeMunge ref
|
|
:<|> healthcheck ref
|
|
|
|
unsafeMunge :: IORef Int -> Handler ()
|
|
unsafeMunge ref = liftIO $ do
|
|
t <- readIORef ref
|
|
writeIORef ref (t+1)
|
|
t2 <- readIORef ref
|
|
writeIORef ref (t2-1)
|