{-# OPTIONS_GHC -Wno-orphans #-}

-- | OpenApi implementation of 'QueryParam' trait.
module WebGear.OpenApi.Trait.QueryParam where

import Data.OpenApi (
  Param (..),
  ParamLocation (ParamQuery),
  Referenced (Inline),
  ToSchema,
  toSchema,
 )
import Data.Proxy (Proxy (Proxy))
import Data.String (fromString)
import GHC.TypeLits (KnownSymbol, symbolVal)
import WebGear.Core.Modifiers
import WebGear.Core.Request (Request)
import WebGear.Core.Trait (Get (..), TraitAbsence)
import WebGear.Core.Trait.QueryParam (QueryParam (..))
import WebGear.OpenApi.Handler (DocNode (DocQueryParam), OpenApiHandler (..), singletonNode)

instance (KnownSymbol name, ToSchema val, TraitAbsence (QueryParam Required ps name val) Request) => Get (OpenApiHandler m) (QueryParam Required ps name val) Request where
  {-# INLINEABLE getTrait #-}
  getTrait :: forall (ts :: [*]).
QueryParam 'Required ps name val
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (QueryParam 'Required ps name val) Request)
        (Attribute (QueryParam 'Required ps name val) Request))
getTrait QueryParam 'Required ps name val
_ =
    let param :: Param
param =
          (forall a. Monoid a => a
mempty :: Param)
            { _paramName :: Text
_paramName = forall a. IsString a => String -> a
fromString forall a b. (a -> b) -> a -> b
$ forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @name
            , _paramIn :: ParamLocation
_paramIn = ParamLocation
ParamQuery
            , _paramRequired :: Maybe Bool
_paramRequired = forall a. a -> Maybe a
Just Bool
True
            , _paramSchema :: Maybe (Referenced Schema)
_paramSchema = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. a -> Referenced a
Inline forall a b. (a -> b) -> a -> b
$ forall a. ToSchema a => Proxy a -> Schema
toSchema forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @val
            }
     in forall {k} {k} {k} (m :: k) (a :: k) (b :: k).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler forall a b. (a -> b) -> a -> b
$ forall a. a -> Tree a
singletonNode (Param -> DocNode
DocQueryParam Param
param)

instance (KnownSymbol name, ToSchema val, TraitAbsence (QueryParam Optional ps name val) Request) => Get (OpenApiHandler m) (QueryParam Optional ps name val) Request where
  {-# INLINEABLE getTrait #-}
  getTrait :: forall (ts :: [*]).
QueryParam 'Optional ps name val
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (QueryParam 'Optional ps name val) Request)
        (Attribute (QueryParam 'Optional ps name val) Request))
getTrait QueryParam 'Optional ps name val
_ =
    let param :: Param
param =
          (forall a. Monoid a => a
mempty :: Param)
            { _paramName :: Text
_paramName = forall a. IsString a => String -> a
fromString forall a b. (a -> b) -> a -> b
$ forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @name
            , _paramIn :: ParamLocation
_paramIn = ParamLocation
ParamQuery
            , _paramRequired :: Maybe Bool
_paramRequired = forall a. a -> Maybe a
Just Bool
False
            , _paramSchema :: Maybe (Referenced Schema)
_paramSchema = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. a -> Referenced a
Inline forall a b. (a -> b) -> a -> b
$ forall a. ToSchema a => Proxy a -> Schema
toSchema forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @val
            }
     in forall {k} {k} {k} (m :: k) (a :: k) (b :: k).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler forall a b. (a -> b) -> a -> b
$ forall a. a -> Tree a
singletonNode (Param -> DocNode
DocQueryParam Param
param)