@@ -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.
@@ -583,15 +586,32 @@ genericToNamedSchemaBoundedIntegral opts proxy
583586 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
584587
585588-- | A configurable generic @'Schema'@ creator.
586−genericDeclareSchema :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
587−genericDeclareSchema opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchema opts proxy
589+genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
590+ SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
591+genericDeclareSchema = genericDeclareSchemaUnrestricted
588592
589593-- | A configurable generic @'NamedSchema'@ creator.
590594-- This function applied to @'defaultSchemaOptions'@
591595-- is used as the default for @'declareNamedSchema'@
592596-- when the type is an instance of @'Generic'@.
593−genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
594−genericDeclareNamedSchema opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
597+genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
598+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
599+genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
600+
601+-- | A configurable generic @'Schema'@ creator.
602+--
603+-- Unlike 'genericDeclareSchema' also works for mixed sum types.
604+-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
605+genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
606+genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
607+
608+-- | A configurable generic @'NamedSchema'@ creator.
609+--
610+-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
611+-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
612+genericDeclareNamedSchemaUnrestricted :: forall a proxy. (Generic a, GToSchema (Rep a)) =>
613+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
614+genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
595615
596616gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
597617gdatatypeSchemaName opts _ = case name of
@@ -710,7 +730,10 @@ instance OVERLAPPING_ ToSchema c => GToSchema (K1 i (Maybe c)) where
710730instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
711731 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
712732
713−instance (GSumToSchema f, GSumToSchema g) => GToSchema (f :+: g) where
733+instance ( GSumToSchema f
734+ , GSumToSchema g
735+ ) => GToSchema (f :+: g)
736+ where
714737 gdeclareNamedSchema = gdeclareNamedSumSchema
715738
716739gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema