{-# OPTIONS_GHC -Wno-orphans #-}

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

import Data.Proxy (Proxy (Proxy))
import Data.String (fromString)
import Data.Swagger (
  Param (..),
  ParamAnySchema (..),
  ParamLocation (ParamQuery),
  ParamOtherSchema (..),
 )
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.Swagger.Handler (DocNode (DocQueryParam), SwaggerHandler (..), singletonNode)

instance (KnownSymbol name, TraitAbsence (QueryParam Required ps name val) Request) => Get (SwaggerHandler m) (QueryParam Required ps name val) Request where
  {-# INLINE getTrait #-}
  getTrait :: forall (ts :: [*]).
QueryParam 'Required ps name val
-> SwaggerHandler
     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 =
          (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
            , _paramRequired :: Maybe Bool
_paramRequired = forall a. a -> Maybe a
Just Bool
True
            , _paramSchema :: ParamAnySchema
_paramSchema =
                ParamOtherSchema -> ParamAnySchema
ParamOther
                  forall a b. (a -> b) -> a -> b
$ ParamOtherSchema
                    { _paramOtherSchemaIn :: ParamLocation
_paramOtherSchemaIn = ParamLocation
ParamQuery
                    , _paramOtherSchemaAllowEmptyValue :: Maybe Bool
_paramOtherSchemaAllowEmptyValue = forall a. a -> Maybe a
Just Bool
True
                    , _paramOtherSchemaParamSchema :: ParamSchema 'SwaggerKindParamOtherSchema
_paramOtherSchemaParamSchema = forall a. Monoid a => a
mempty
                    }
            }
     in forall {k} {k} {k} (m :: k) (a :: k) (b :: k).
Tree DocNode -> SwaggerHandler m a b
SwaggerHandler forall a b. (a -> b) -> a -> b
$ forall a. a -> Tree a
singletonNode (Param -> DocNode
DocQueryParam Param
param)

instance (KnownSymbol name, TraitAbsence (QueryParam Optional ps name val) Request) => Get (SwaggerHandler m) (QueryParam Optional ps name val) Request where
  {-# INLINE getTrait #-}
  getTrait :: forall (ts :: [*]).
QueryParam 'Optional ps name val
-> SwaggerHandler
     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 =
          (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
            , _paramRequired :: Maybe Bool
_paramRequired = forall a. a -> Maybe a
Just Bool
False
            , _paramSchema :: ParamAnySchema
_paramSchema =
                ParamOtherSchema -> ParamAnySchema
ParamOther
                  forall a b. (a -> b) -> a -> b
$ ParamOtherSchema
                    { _paramOtherSchemaIn :: ParamLocation
_paramOtherSchemaIn = ParamLocation
ParamQuery
                    , _paramOtherSchemaAllowEmptyValue :: Maybe Bool
_paramOtherSchemaAllowEmptyValue = forall a. a -> Maybe a
Just Bool
True
                    , _paramOtherSchemaParamSchema :: ParamSchema 'SwaggerKindParamOtherSchema
_paramOtherSchemaParamSchema = forall a. Monoid a => a
mempty
                    }
            }
     in forall {k} {k} {k} (m :: k) (a :: k) (b :: k).
Tree DocNode -> SwaggerHandler m a b
SwaggerHandler forall a b. (a -> b) -> a -> b
$ forall a. a -> Tree a
singletonNode (Param -> DocNode
DocQueryParam Param
param)