@@ -1,4 +1,5 @@
11{-# LANGUAGE CPP #-}
2+{-# LANGUAGE ConstraintKinds #-}
23{-# LANGUAGE DefaultSignatures #-}
34{-# LANGUAGE FlexibleContexts #-}
45{-# LANGUAGE FlexibleInstances #-}
@@ -64,6 +65,7 @@ import Data.Swagger.Internal.ParamSchema (ToParamSchema(..))
6465import Data.Swagger.Lens hiding (name, schema)
6566import qualified Data.Swagger.Lens as Swagger
6667import Data.Swagger.SchemaOptions
68+import Data.Swagger.Internal.TypeShape
6769
6870#if __GLASGOW_HASKELL__ < 800
6971#else
@@ -137,7 +139,8 @@ class ToSchema a where
137139 -- Note that the schema itself is included in definitions
138140 -- only if it is recursive (and thus needs its definition in scope).
139141 declareNamedSchema :: proxy a -> Declare (Definitions Schema) NamedSchema
140− default declareNamedSchema :: (Generic a, GToSchema (Rep a)) => proxy a -> Declare (Definitions Schema) NamedSchema
142+ default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
143+ proxy a -> Declare (Definitions Schema) NamedSchema
141144 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
142145
143146-- | Convert a type into a schema and declare all used schema definitions.
@@ -581,15 +584,32 @@ genericToNamedSchemaBoundedIntegral opts proxy
581584 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
582585
583586-- | A configurable generic @'Schema'@ creator.
584−genericDeclareSchema :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
585−genericDeclareSchema opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchema opts proxy
587+genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
588+ SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
589+genericDeclareSchema = genericDeclareSchemaUnrestricted
586590
587591-- | A configurable generic @'NamedSchema'@ creator.
588592-- This function applied to @'defaultSchemaOptions'@
589593-- is used as the default for @'declareNamedSchema'@
590594-- when the type is an instance of @'Generic'@.
591−genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
592−genericDeclareNamedSchema opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
595+genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
596+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
597+genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
598+
599+-- | A configurable generic @'Schema'@ creator.
600+--
601+-- Unlike 'genericDeclareSchema' also works for mixed sum types.
602+-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
603+genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
604+genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
605+
606+-- | A configurable generic @'NamedSchema'@ creator.
607+--
608+-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
609+-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
610+genericDeclareNamedSchemaUnrestricted :: forall a proxy. (Generic a, GToSchema (Rep a)) =>
611+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
612+genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
593613
594614gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
595615gdatatypeSchemaName opts _ = case name of
@@ -708,7 +728,10 @@ instance OVERLAPPING_ ToSchema c => GToSchema (K1 i (Maybe c)) where
708728instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
709729 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
710730
711−instance (GSumToSchema f, GSumToSchema g) => GToSchema (f :+: g) where
731+instance ( GSumToSchema f
732+ , GSumToSchema g
733+ ) => GToSchema (f :+: g)
734+ where
712735 gdeclareNamedSchema = gdeclareNamedSumSchema
713736
714737gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema