module Mensam.Client.Debug where import Mensam.API.Aeson import Mensam.API.Data.Desk import Mensam.API.Data.Reservation import Mensam.API.Data.Space import Mensam.API.Data.User.Password import Mensam.API.Data.User.Username import Mensam.API.Route.Api.Reservation qualified as Route.Reservation import Mensam.API.Route.Api.Space qualified as Route.Space import Mensam.API.Route.Api.User qualified as Route.User import Mensam.Client.Application import Mensam.Client.Application.MensamClient.Class import Mensam.Client.OrphanInstances import Control.Monad.IO.Class import Control.Monad.Trans.Class import Data.SOP import Data.Time qualified as T import Data.Time.Zones.All qualified as T import Servant import Servant.Client import Text.Email.Parser import Text.Email.Text runF :: IO () runF :: IO () runF = BChan ClientEvent -> ApplicationT IO () -> IO () forall (m :: * -> *) a. MonadIO m => BChan ClientEvent -> ApplicationT m a -> m a runApplicationT BChan ClientEvent forall a. HasCallStack => a undefined (ApplicationT IO () -> IO ()) -> ApplicationT IO () -> IO () forall a b. (a -> b) -> a -> b $ do Either ClientError () result <- ClientM () -> ApplicationT IO (Either ClientError ()) forall a. ClientM a -> ApplicationT IO (Either ClientError a) forall (m :: * -> *) a. MonadMensamClient m => ClientM a -> m (Either ClientError a) mensamCall ClientM () f IO () -> ApplicationT IO () forall (m :: * -> *) a. Monad m => m a -> ApplicationT m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (IO () -> ApplicationT IO ()) -> IO () -> ApplicationT IO () forall a b. (a -> b) -> a -> b $ Either ClientError () -> IO () forall a. Show a => a -> IO () print Either ClientError () result f :: ClientM () f :: ClientM () f = do let Username name :: Username = Text -> Username MkUsernameUnsafe Text "maxmustermann7" Password pw :: Password = Text -> Password MkPasswordUnsafe Text "pw" EmailAddress email :: EmailAddress = Text -> EmailAddress fromTextUnsafe Text "maxmustermann@gmail.com" NameSpace spacename :: NameSpace = Text -> NameSpace MkNameSpace Text "solarsystem" IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Register." let requestRegister :: RequestRegister requestRegister = Route.User.MkRequestRegister { requestRegisterName :: Username Route.User.requestRegisterName = Username name , requestRegisterPassword :: Password Route.User.requestRegisterPassword = Password pw , requestRegisterEmail :: EmailAddress Route.User.requestRegisterEmail = EmailAddress email , requestRegisterEmailVisible :: Bool Route.User.requestRegisterEmailVisible = Bool True , requestRegisterEmailNotifications :: Bool Route.User.requestRegisterEmailNotifications = Bool False } Union '[WithStatus 201 ResponseRegister, WithStatus 400 ErrorParseBodyJson, WithStatus 409 (StaticText "Username is taken."), WithStatus 500 ()] resultRegister <- RequestRegister -> ClientM (Union '[WithStatus 201 ResponseRegister, WithStatus 400 ErrorParseBodyJson, WithStatus 409 (StaticText "Username is taken."), WithStatus 500 ()]) endpointRegister RequestRegister requestRegister IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 201 ResponseRegister, WithStatus 400 ErrorParseBodyJson, WithStatus 409 (StaticText "Username is taken."), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 201 ResponseRegister, WithStatus 400 ErrorParseBodyJson, WithStatus 409 (StaticText "Username is taken."), WithStatus 500 ()] resultRegister IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Login with BasicAuth." let credentials :: Credentials credentials = MkCredentials { credentialsUsername :: Text credentialsUsername = Username -> Text unUsername Username name , credentialsPassword :: Text credentialsPassword = Password -> Text unPassword Password pw } Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] resultLogin <- AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()]) endpointLogin (AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()])) -> AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()]) forall a b. (a -> b) -> a -> b $ Credentials -> AuthData '[BasicAuth, JWTWithSession] forall (auths :: [*]). Credentials -> AuthData (BasicAuth : auths) DataBasicAuth Credentials credentials IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] resultLogin ResponseLogin responseLogin <- case Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] resultLogin of Z (I (WithStatus @200 ResponseLogin x)) -> ResponseLogin -> ClientM ResponseLogin forall a. a -> ClientM a forall (f :: * -> *) a. Applicative f => a -> f a pure ResponseLogin x Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] _ -> ClientM ResponseLogin forall a. HasCallStack => a undefined IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Login with JWT." let token :: Jwt token = ResponseLogin -> Jwt Route.User.responseLoginJwt ResponseLogin responseLogin Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] nextLoginResult <- AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()]) endpointLogin (AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()])) -> AuthData '[BasicAuth, JWTWithSession] -> ClientM (Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()]) forall a b. (a -> b) -> a -> b $ AuthData '[JWTWithSession] -> AuthData '[BasicAuth, JWTWithSession] forall (xs1 :: [*]) x. AuthData xs1 -> AuthData (x : xs1) DataNextAuth (AuthData '[JWTWithSession] -> AuthData '[BasicAuth, JWTWithSession]) -> AuthData '[JWTWithSession] -> AuthData '[BasicAuth, JWTWithSession] forall a b. (a -> b) -> a -> b $ Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt token IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] nextLoginResult ResponseLogin nextResponseLogin <- case Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] resultLogin of Z (I (WithStatus @200 ResponseLogin x)) -> ResponseLogin -> ClientM ResponseLogin forall a. a -> ClientM a forall (f :: * -> *) a. Applicative f => a -> f a pure ResponseLogin x Union '[WithStatus 200 ResponseLogin, WithStatus 401 ErrorBasicAuth, WithStatus 500 ()] _ -> ClientM ResponseLogin forall a. HasCallStack => a undefined let nextToken :: Jwt nextToken = ResponseLogin -> Jwt Route.User.responseLoginJwt ResponseLogin nextResponseLogin IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Profile." let requestProfile :: RequestProfile requestProfile = Route.User.MkRequestProfile { requestProfileUser :: NameOrIdentifier Username IdentifierUser Route.User.requestProfileUser = Username -> NameOrIdentifier Username IdentifierUser forall name identifier. name -> NameOrIdentifier name identifier Name Username name } Union '[WithStatus 200 ResponseProfile, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 404 (), WithStatus 500 ()] resultProfile <- AuthData '[JWTWithSession] -> RequestProfile -> ClientM (Union '[WithStatus 200 ResponseProfile, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 404 (), WithStatus 500 ()]) endpointProfile (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestProfile requestProfile IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 200 ResponseProfile, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 404 (), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 200 ResponseProfile, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 404 (), WithStatus 500 ()] resultProfile IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Create space." let requestSpaceCreate :: RequestSpaceCreate requestSpaceCreate = Route.Space.MkRequestSpaceCreate { requestSpaceCreateName :: NameSpace Route.Space.requestSpaceCreateName = NameSpace spacename , requestSpaceCreateTimezone :: TZLabel Route.Space.requestSpaceCreateTimezone = TZLabel T.Europe__Paris , requestSpaceCreateVisibility :: VisibilitySpace Route.Space.requestSpaceCreateVisibility = VisibilitySpace MkVisibilitySpaceVisible } Union '[WithStatus 201 ResponseSpaceCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 500 ()] resultSpaceCreate <- AuthData '[JWTWithSession] -> RequestSpaceCreate -> ClientM (Union '[WithStatus 201 ResponseSpaceCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 500 ()]) endpointSpaceCreate (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestSpaceCreate requestSpaceCreate IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 201 ResponseSpaceCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 201 ResponseSpaceCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 500 ()] resultSpaceCreate IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Create desk." let requestDeskCreate :: RequestDeskCreate requestDeskCreate = Route.Space.MkRequestDeskCreate { requestDeskCreateName :: NameDesk Route.Space.requestDeskCreateName = Text -> NameDesk MkNameDesk Text "neptune" , requestDeskCreateSpace :: NameOrIdentifier NameSpace IdentifierSpace Route.Space.requestDeskCreateSpace = NameSpace -> NameOrIdentifier NameSpace IdentifierSpace forall name identifier. name -> NameOrIdentifier name identifier Name NameSpace spacename , requestDeskCreateLocation :: Maybe LocationDesk Route.Space.requestDeskCreateLocation = Maybe LocationDesk forall a. Maybe a Nothing } Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskCreate <- AuthData '[JWTWithSession] -> RequestDeskCreate -> ClientM (Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()]) endpointDeskCreate (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestDeskCreate requestDeskCreate IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskCreate IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Create desk." let requestDeskCreate2 :: RequestDeskCreate requestDeskCreate2 = Route.Space.MkRequestDeskCreate { requestDeskCreateName :: NameDesk Route.Space.requestDeskCreateName = Text -> NameDesk MkNameDesk Text "saturn" , requestDeskCreateSpace :: NameOrIdentifier NameSpace IdentifierSpace Route.Space.requestDeskCreateSpace = NameSpace -> NameOrIdentifier NameSpace IdentifierSpace forall name identifier. name -> NameOrIdentifier name identifier Name NameSpace spacename , requestDeskCreateLocation :: Maybe LocationDesk Route.Space.requestDeskCreateLocation = Maybe LocationDesk forall a. Maybe a Nothing } Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskCreate2 <- AuthData '[JWTWithSession] -> RequestDeskCreate -> ClientM (Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()]) endpointDeskCreate (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestDeskCreate requestDeskCreate2 IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 201 ResponseDeskCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionEditDesk), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskCreate2 IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "List desks." let requestDeskList :: RequestDeskList requestDeskList = Route.Space.MkRequestDeskList { requestDeskListSpace :: NameOrIdentifier NameSpace IdentifierSpace Route.Space.requestDeskListSpace = NameSpace -> NameOrIdentifier NameSpace IdentifierSpace forall name identifier. name -> NameOrIdentifier name identifier Name NameSpace spacename , requestDeskListTimeWindow :: IntervalUnbounded UTCTime Route.Space.requestDeskListTimeWindow = IntervalUnbounded UTCTime forall a. IntervalUnbounded a unbounded } Union '[WithStatus 200 ResponseDeskList, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionViewSpace), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskList <- AuthData '[JWTWithSession] -> RequestDeskList -> ClientM (Union '[WithStatus 200 ResponseDeskList, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionViewSpace), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()]) endpointDeskList (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestDeskList requestDeskList IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 200 ResponseDeskList, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionViewSpace), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 200 ResponseDeskList, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionViewSpace), WithStatus 404 (StaticText "Space not found."), WithStatus 500 ()] resultDeskList IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ String -> IO () putStrLn String "Create reservation." UTCTime currentTime <- IO UTCTime -> ClientM UTCTime forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO IO UTCTime T.getCurrentTime let requestReservationCreate :: RequestReservationCreate requestReservationCreate = Route.Reservation.MkRequestReservationCreate { requestReservationCreateDesk :: NameOrIdentifier DeskNameWithContext IdentifierDesk Route.Reservation.requestReservationCreateDesk = DeskNameWithContext -> NameOrIdentifier DeskNameWithContext IdentifierDesk forall name identifier. name -> NameOrIdentifier name identifier Name (DeskNameWithContext -> NameOrIdentifier DeskNameWithContext IdentifierDesk) -> DeskNameWithContext -> NameOrIdentifier DeskNameWithContext IdentifierDesk forall a b. (a -> b) -> a -> b $ NameDesk -> NameSpace -> DeskNameWithContext MkDeskNameWithContext (Text -> NameDesk MkNameDesk Text "saturn") NameSpace spacename , requestReservationCreateTimeWindow :: IntervalNonDegenerate UTCTime Route.Reservation.requestReservationCreateTimeWindow = Interval UTCTime -> IntervalNonDegenerate UTCTime forall a. Interval a -> IntervalNonDegenerate a MkIntervalNonDegenerateUnsafe (Interval UTCTime -> IntervalNonDegenerate UTCTime) -> Interval UTCTime -> IntervalNonDegenerate UTCTime forall a b. (a -> b) -> a -> b $ UTCTime -> UTCTime -> Interval UTCTime forall a. a -> a -> Interval a MkIntervalUnsafe UTCTime currentTime (Pico -> NominalDiffTime T.secondsToNominalDiffTime (Pico 60 Pico -> Pico -> Pico forall a. Num a => a -> a -> a * Pico 60) NominalDiffTime -> UTCTime -> UTCTime `T.addUTCTime` UTCTime currentTime) } Union '[WithStatus 201 ResponseReservationCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionCreateReservation), WithStatus 409 (StaticText "Desk is not available within the given time window."), WithStatus 500 ()] resultReservationCreate <- AuthData '[JWTWithSession] -> RequestReservationCreate -> ClientM (Union '[WithStatus 201 ResponseReservationCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionCreateReservation), WithStatus 409 (StaticText "Desk is not available within the given time window."), WithStatus 500 ()]) endpointReservationCreate (Jwt -> AuthData '[JWTWithSession] forall (auths :: [*]). Jwt -> AuthData (JWTWithSession : auths) DataJWTWithSession Jwt nextToken) RequestReservationCreate requestReservationCreate IO () -> ClientM () forall a. IO a -> ClientM a forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO () -> ClientM ()) -> IO () -> ClientM () forall a b. (a -> b) -> a -> b $ Union '[WithStatus 201 ResponseReservationCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionCreateReservation), WithStatus 409 (StaticText "Desk is not available within the given time window."), WithStatus 500 ()] -> IO () forall a. Show a => a -> IO () print Union '[WithStatus 201 ResponseReservationCreate, WithStatus 400 ErrorParseBodyJson, WithStatus 401 ErrorBearerAuth, WithStatus 403 (ErrorInsufficientPermission 'MkPermissionCreateReservation), WithStatus 409 (StaticText "Desk is not available within the given time window."), WithStatus 500 ()] resultReservationCreate () -> ClientM () forall a. a -> ClientM a forall (f :: * -> *) a. Applicative f => a -> f a pure ()