@@ -1,4 +1,5 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE DefaultSignatures #-}
3{-# LANGUAGE DefaultSignatures #-}
3{-# LANGUAGE FlexibleContexts #-}
4{-# LANGUAGE FlexibleContexts #-}
4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
@@ -64,6 +65,7 @@ import Data.Swagger.Internal.ParamSchema (ToParamSchema(..))
64import Data.Swagger.Lens hiding (name, schema)
65import Data.Swagger.Lens hiding (name, schema)
65import qualified Data.Swagger.Lens as Swagger
66import qualified Data.Swagger.Lens as Swagger
66import Data.Swagger.SchemaOptions
67import Data.Swagger.SchemaOptions
68+import Data.Swagger.Internal.TypeShape
68#if __GLASGOW_HASKELL__ < 800
70#if __GLASGOW_HASKELL__ < 800
@@ -137,7 +139,8 @@ class ToSchema a where
137 -- Note that the schema itself is included in definitions
139 -- Note that the schema itself is included in definitions
138 -- only if it is recursive (and thus needs its definition in scope).
140 -- only if it is recursive (and thus needs its definition in scope).
139 declareNamedSchema :: proxy a -> Declare (Definitions Schema) NamedSchema
141 declareNamedSchema :: proxy a -> Declare (Definitions Schema) NamedSchema
142+ default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
140− default declareNamedSchema :: (Generic a, GToSchema (Rep a)) => proxy a -> Declare (Definitions Schema) NamedSchema
143+ proxy a -> Declare (Definitions Schema) NamedSchema
141 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
144 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
143-- | Convert a type into a schema and declare all used schema definitions.
146-- | Convert a type into a schema and declare all used schema definitions.
@@ -583,15 +586,32 @@ genericToNamedSchemaBoundedIntegral opts proxy
583 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
586 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
585-- | A configurable generic @'Schema'@ creator.
588-- | A configurable generic @'Schema'@ creator.
589+genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
586−genericDeclareSchema :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
590+ SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
587−genericDeclareSchema opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchema opts proxy
591+genericDeclareSchema = genericDeclareSchemaUnrestricted
589-- | A configurable generic @'NamedSchema'@ creator.
593-- | A configurable generic @'NamedSchema'@ creator.
590-- This function applied to @'defaultSchemaOptions'@
594-- This function applied to @'defaultSchemaOptions'@
591-- is used as the default for @'declareNamedSchema'@
595-- is used as the default for @'declareNamedSchema'@
592-- when the type is an instance of @'Generic'@.
596-- 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
597+genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
598+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
599+genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
601+-- | A configurable generic @'Schema'@ creator.
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
608+-- | A configurable generic @'NamedSchema'@ creator.
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
594−genericDeclareNamedSchema opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
614+genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
596gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
616gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
597gdatatypeSchemaName opts _ = case name of
617gdatatypeSchemaName opts _ = case name of
@@ -710,7 +730,10 @@ instance OVERLAPPING_ ToSchema c => GToSchema (K1 i (Maybe c)) where
710instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
730instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
711 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
731 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
713−instance (GSumToSchema f, GSumToSchema g) => GToSchema (f :+: g) where
733+instance ( GSumToSchema f
735+ ) => GToSchema (f :+: g)
714 gdeclareNamedSchema = gdeclareNamedSumSchema
737 gdeclareNamedSchema = gdeclareNamedSumSchema
716gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
739gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema