module Web.Hyperbole.Effect.Request where

import Data.String.Conversions (cs)
import Effectful
import Effectful.Dispatch.Dynamic
import Web.FormUrlEncoded (Form, urlDecodeForm)
import Web.Hyperbole.Data.URI (Path (..))
import Web.Hyperbole.Effect.Hyperbole
import Web.Hyperbole.Types.Request
import Web.Hyperbole.Types.Response


-- | Return all information about the 'Request'
request :: (Hyperbole :> es) => Eff es Request
request :: forall (es :: [Effect]). (Hyperbole :> es) => Eff es Request
request = Hyperbole (Eff es) Request -> Eff es Request
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send Hyperbole (Eff es) Request
forall (a :: * -> *). Hyperbole a Request
GetRequest


{- | Return the request path

>>> reqPath
["users", "100"]
-}
reqPath :: (Hyperbole :> es) => Eff es Path
reqPath :: forall (es :: [Effect]). (Hyperbole :> es) => Eff es Path
reqPath = (.path) (Request -> Path) -> Eff es Request -> Eff es Path
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Eff es Request
forall (es :: [Effect]). (Hyperbole :> es) => Eff es Request
request


{- | Return the request body as a Web.FormUrlEncoded.Form

Prefer using Type-Safe 'Form's when possible
-}
formBody :: (Hyperbole :> es) => Eff es Form
formBody :: forall (es :: [Effect]). (Hyperbole :> es) => Eff es Form
formBody = do
  ByteString
b <- (.body) (Request -> ByteString) -> Eff es Request -> Eff es ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Eff es Request
forall (es :: [Effect]). (Hyperbole :> es) => Eff es Request
request
  let ef :: Either Text Form
ef = ByteString -> Either Text Form
urlDecodeForm ByteString
b
  (Text -> Eff es Form)
-> (Form -> Eff es Form) -> Either Text Form -> Eff es Form
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Hyperbole (Eff es) Form -> Eff es Form
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Hyperbole (Eff es) Form -> Eff es Form)
-> (Text -> Hyperbole (Eff es) Form) -> Text -> Eff es Form
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Response -> Hyperbole (Eff es) Form
forall (a :: * -> *) b. Response -> Hyperbole a b
RespondNow (Response -> Hyperbole (Eff es) Form)
-> (Text -> Response) -> Text -> Hyperbole (Eff es) Form
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResponseError -> Response
Err (ResponseError -> Response)
-> (Text -> ResponseError) -> Text -> Response
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ResponseError
ErrParse (String -> ResponseError)
-> (Text -> String) -> Text -> ResponseError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
forall a b. ConvertibleStrings a b => a -> b
cs) Form -> Eff es Form
forall a. a -> Eff es a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Either Text Form
ef