{-# 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
  {-# INLINE getTrait #-}
  getTrait :: forall (ts :: [*]).
Prerequisite (QueryParam 'Required ps name val) ts Request =>
QueryParam 'Required ps name val
-> OpenApiHandler
     m
     (With Request ts)
     (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 =
          (Param
forall a. Monoid a => a
mempty :: Param)
            { _paramName = fromString $ symbolVal $ Proxy @name
            , _paramIn = ParamQuery
            , _paramRequired = Just True
            , _paramSchema = Just $ Inline $ toSchema $ Proxy @val
            }
     in Tree DocNode
-> OpenApiHandler
     m
     (With Request ts)
     (Either
        (Absence (QueryParam 'Required ps name val) Request)
        (Attribute (QueryParam 'Required ps name val) Request))
forall {k} {k1} {k2} (m :: k) (a :: k1) (b :: k2).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler (Tree DocNode
 -> OpenApiHandler
      m
      (With Request ts)
      (Either
         (Absence (QueryParam 'Required ps name val) Request)
         (Attribute (QueryParam 'Required ps name val) Request)))
-> Tree DocNode
-> OpenApiHandler
     m
     (With Request ts)
     (Either
        (Absence (QueryParam 'Required ps name val) Request)
        (Attribute (QueryParam 'Required ps name val) Request))
forall a b. (a -> b) -> a -> b
$ DocNode -> Tree DocNode
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
  {-# INLINE getTrait #-}
  getTrait :: forall (ts :: [*]).
Prerequisite (QueryParam 'Optional ps name val) ts Request =>
QueryParam 'Optional ps name val
-> OpenApiHandler
     m
     (With Request ts)
     (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 =
          (Param
forall a. Monoid a => a
mempty :: Param)
            { _paramName = fromString $ symbolVal $ Proxy @name
            , _paramIn = ParamQuery
            , _paramRequired = Just False
            , _paramSchema = Just $ Inline $ toSchema $ Proxy @val
            }
     in Tree DocNode
-> OpenApiHandler
     m
     (With Request ts)
     (Either
        (Absence (QueryParam 'Optional ps name val) Request)
        (Attribute (QueryParam 'Optional ps name val) Request))
forall {k} {k1} {k2} (m :: k) (a :: k1) (b :: k2).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler (Tree DocNode
 -> OpenApiHandler
      m
      (With Request ts)
      (Either
         (Absence (QueryParam 'Optional ps name val) Request)
         (Attribute (QueryParam 'Optional ps name val) Request)))
-> Tree DocNode
-> OpenApiHandler
     m
     (With Request ts)
     (Either
        (Absence (QueryParam 'Optional ps name val) Request)
        (Attribute (QueryParam 'Optional ps name val) Request))
forall a b. (a -> b) -> a -> b
$ DocNode -> Tree DocNode
forall a. a -> Tree a
singletonNode (Param -> DocNode
DocQueryParam Param
param)