webgear-openapi-1.1.0: src/WebGear/OpenApi/Trait/Body.hs
{-# OPTIONS_GHC -Wno-orphans #-}
-- | OpenApi implementation of 'Body' trait.
module WebGear.OpenApi.Trait.Body where
import Control.Lens ((&), (.~), (?~))
import Data.OpenApi hiding (Response, contentType)
import Data.OpenApi.Declare (runDeclare)
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import GHC.Exts (fromList)
import WebGear.Core.MIMETypes (MIMEType (..))
import WebGear.Core.Request (Request)
import WebGear.Core.Response (Response (..), ResponseBody)
import WebGear.Core.Trait (Get (..), Set (..), With)
import WebGear.Core.Trait.Body (Body (..), UnknownContentBody (..))
import WebGear.OpenApi.Handler (
DocNode (DocRequestBody, DocResponseBody),
OpenApiHandler (..),
singletonNode,
)
instance (ToSchema val, MIMEType mt) => Get (OpenApiHandler m) (Body mt val) Request where
{-# INLINE getTrait #-}
getTrait :: Body mt val -> OpenApiHandler m (Request `With` ts) (Either Text val)
getTrait (Body mt) =
let mediaType = mimeType mt
(defs, ref) = runDeclare (declareSchemaRef $ Proxy @val) mempty
body =
(mempty @RequestBody)
& content .~ fromList [(mediaType, mempty @MediaTypeObject & schema ?~ ref)]
in OpenApiHandler $ singletonNode (DocRequestBody defs body)
instance (ToSchema val, MIMEType mt) => Set (OpenApiHandler m) (Body mt val) Response where
{-# INLINE setTrait #-}
setTrait ::
Body mt val ->
(Response `With` ts -> Response -> val -> Response `With` (Body mt val : ts)) ->
OpenApiHandler m (Response `With` ts, val) (Response `With` (Body mt val : ts))
setTrait (Body mt) _ =
let mediaType = mimeType mt
(defs, ref) = runDeclare (declareSchemaRef $ Proxy @val) mempty
body = mempty @MediaTypeObject & schema ?~ ref
in OpenApiHandler $ singletonNode (DocResponseBody defs $ fromList [(mediaType, body)])
instance Set (OpenApiHandler m) UnknownContentBody Response where
{-# INLINE setTrait #-}
setTrait ::
UnknownContentBody ->
(Response `With` ts -> Response -> ResponseBody -> Response `With` (UnknownContentBody : ts)) ->
OpenApiHandler m (Response `With` ts, ResponseBody) (Response `With` (UnknownContentBody : ts))
setTrait UnknownContentBody _ = OpenApiHandler $ singletonNode (DocResponseBody mempty mempty)