content: {-# LANGUAGE CPP #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE MonoLocalBinds #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  
  {-# OPTIONS_GHC -Wno-orphans #-}
  
  module Proto3.Suite.DotProto.Generate.Swagger.Wrappers where
  
  #if MIN_VERSION_swagger2(2,4,0)
  import Control.Lens ((?~))
  #else
  import Control.Lens ((.~))
  #endif
  import Data.Functor ((<&>))
  import Data.Int (Int32, Int64)
  import Data.Proxy (Proxy (..))
  import Data.Swagger
    ( Definitions
    , NamedSchema (..)
    , Schema
    , ToSchema (..)
    , byteSchema
    , format
    , paramSchema
    , schema
    )
  import Data.Swagger.Declare (Declare)
  import Data.Word (Word32, Word64)
  import Google.Protobuf.Wrappers.Polymorphic (Wrapped(..))
  
  import qualified Data.Text as T
  import qualified Proto3.Suite.Types
  
  -- | Wrapped Type Schemas
  
  setFormat
    :: T.Text
    -> Declare (Definitions Schema) NamedSchema
    -> Declare (Definitions Schema) NamedSchema
  setFormat formatValue namedSchema =
    namedSchema
  #if MIN_VERSION_swagger2(2,4,0)
      <&> schema . paramSchema . format ?~ formatValue
  #else
      <&> schema . paramSchema . format .~ formatValue
  #endif
  
  declareWrapperNamedSchema
    :: forall a
     . ToSchema a
    => T.Text
    -> Proxy (Maybe (Wrapped a))
    -> Declare (Definitions Schema) NamedSchema
  declareWrapperNamedSchema formatValue _ =
    setFormat formatValue (declareNamedSchema (Proxy :: Proxy a))
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Double)) where
    declareNamedSchema = declareWrapperNamedSchema "DoubleValue"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Float)) where
    declareNamedSchema = declareWrapperNamedSchema "FloatValue"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Int64)) where
    declareNamedSchema = declareWrapperNamedSchema "Int64Value"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Word64)) where
    declareNamedSchema = declareWrapperNamedSchema "UInt64Value"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Int32)) where
    declareNamedSchema = declareWrapperNamedSchema "Int32Value"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Word32)) where
    declareNamedSchema = declareWrapperNamedSchema "UInt32Value"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped Bool)) where
    declareNamedSchema = declareWrapperNamedSchema "BoolValue"
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped (Proto3.Suite.Types.String a))) where
    declareNamedSchema _ =
      setFormat "StringValue" (declareNamedSchema (Proxy :: Proxy String))
  
  instance {-# OVERLAPPING #-} ToSchema (Maybe (Wrapped (Proto3.Suite.Types.Bytes a))) where
    declareNamedSchema _ =
      setFormat "BytesValue" (pure (NamedSchema Nothing byteSchema))
  