{-# 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 :: 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 =
          (Param
forall a. Monoid a => a
mempty :: Param)
            { _paramName :: Text
_paramName = String -> Text
forall a. IsString a => String -> a
fromString (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Proxy name -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy name -> String) -> Proxy name -> String
forall a b. (a -> b) -> a -> b
$ Proxy name
forall k (t :: k). Proxy t
Proxy @name
            , _paramIn :: ParamLocation
_paramIn = ParamLocation
ParamQuery
            , _paramRequired :: Maybe Bool
_paramRequired = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
            , _paramSchema :: Maybe (Referenced Schema)
_paramSchema = Referenced Schema -> Maybe (Referenced Schema)
forall a. a -> Maybe a
Just (Referenced Schema -> Maybe (Referenced Schema))
-> Referenced Schema -> Maybe (Referenced Schema)
forall a b. (a -> b) -> a -> b
$ Schema -> Referenced Schema
forall a. a -> Referenced a
Inline (Schema -> Referenced Schema) -> Schema -> Referenced Schema
forall a b. (a -> b) -> a -> b
$ Proxy val -> Schema
forall a. ToSchema a => Proxy a -> Schema
toSchema (Proxy val -> Schema) -> Proxy val -> Schema
forall a b. (a -> b) -> a -> b
$ Proxy val
forall k (t :: k). Proxy t
Proxy @val
            }
     in Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (QueryParam 'Required ps name val) Request)
        (Attribute (QueryParam 'Required ps name val) Request))
forall k k k (m :: k) (a :: k) (b :: k).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler (Tree DocNode
 -> OpenApiHandler
      m
      (Linked ts Request)
      (Either
         (Absence (QueryParam 'Required ps name val) Request)
         (Attribute (QueryParam 'Required ps name val) Request)))
-> Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (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
  {-# INLINEABLE getTrait #-}
  getTrait :: 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 =
          (Param
forall a. Monoid a => a
mempty :: Param)
            { _paramName :: Text
_paramName = String -> Text
forall a. IsString a => String -> a
fromString (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Proxy name -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy name -> String) -> Proxy name -> String
forall a b. (a -> b) -> a -> b
$ Proxy name
forall k (t :: k). Proxy t
Proxy @name
            , _paramIn :: ParamLocation
_paramIn = ParamLocation
ParamQuery
            , _paramRequired :: Maybe Bool
_paramRequired = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False
            , _paramSchema :: Maybe (Referenced Schema)
_paramSchema = Referenced Schema -> Maybe (Referenced Schema)
forall a. a -> Maybe a
Just (Referenced Schema -> Maybe (Referenced Schema))
-> Referenced Schema -> Maybe (Referenced Schema)
forall a b. (a -> b) -> a -> b
$ Schema -> Referenced Schema
forall a. a -> Referenced a
Inline (Schema -> Referenced Schema) -> Schema -> Referenced Schema
forall a b. (a -> b) -> a -> b
$ Proxy val -> Schema
forall a. ToSchema a => Proxy a -> Schema
toSchema (Proxy val -> Schema) -> Proxy val -> Schema
forall a b. (a -> b) -> a -> b
$ Proxy val
forall k (t :: k). Proxy t
Proxy @val
            }
     in Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (Either
        (Absence (QueryParam 'Optional ps name val) Request)
        (Attribute (QueryParam 'Optional ps name val) Request))
forall k k k (m :: k) (a :: k) (b :: k).
Tree DocNode -> OpenApiHandler m a b
OpenApiHandler (Tree DocNode
 -> OpenApiHandler
      m
      (Linked ts Request)
      (Either
         (Absence (QueryParam 'Optional ps name val) Request)
         (Attribute (QueryParam 'Optional ps name val) Request)))
-> Tree DocNode
-> OpenApiHandler
     m
     (Linked ts Request)
     (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)