@@ -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.
@@ -581,15 +584,32 @@ genericToNamedSchemaBoundedIntegral opts proxy
581 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
584 = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
583-- | A configurable generic @'Schema'@ creator.
586-- | A configurable generic @'Schema'@ creator.
587+genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
584−genericDeclareSchema :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
588+ SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
585−genericDeclareSchema opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchema opts proxy
589+genericDeclareSchema = genericDeclareSchemaUnrestricted
587-- | A configurable generic @'NamedSchema'@ creator.
591-- | A configurable generic @'NamedSchema'@ creator.
588-- This function applied to @'defaultSchemaOptions'@
592-- This function applied to @'defaultSchemaOptions'@
589-- is used as the default for @'declareNamedSchema'@
593-- is used as the default for @'declareNamedSchema'@
590-- when the type is an instance of @'Generic'@.
594-- 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
595+genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
596+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
597+genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
599+-- | A configurable generic @'Schema'@ creator.
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
606+-- | A configurable generic @'NamedSchema'@ creator.
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
592−genericDeclareNamedSchema opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
612+genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
594gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
614gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
595gdatatypeSchemaName opts _ = case name of
615gdatatypeSchemaName opts _ = case name of
@@ -708,7 +728,10 @@ instance OVERLAPPING_ ToSchema c => GToSchema (K1 i (Maybe c)) where
708instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
728instance OVERLAPPABLE_ ToSchema c => GToSchema (K1 i c) where
709 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
729 gdeclareNamedSchema _ _ _ = declareNamedSchema (Proxy :: Proxy c)
711−instance (GSumToSchema f, GSumToSchema g) => GToSchema (f :+: g) where
731+instance ( GSumToSchema f
733+ ) => GToSchema (f :+: g)
712 gdeclareNamedSchema = gdeclareNamedSumSchema
735 gdeclareNamedSchema = gdeclareNamedSumSchema
714gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
737gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema