@@ -32,7 +32,7 @@ import Data.Data.Lens (template)
33import Control.Monad
33import Control.Monad
34import Control.Monad.Writer
34import Control.Monad.Writer
35−import Data.Aeson (ToJSON (..), ToJSONKey (..), ToJSONKeyFunction (..), Value (..), Object(..))
35+import Data.Aeson (ToJSON (..), ToJSONKey (..), ToJSONKeyFunction (..), Value (..))
36import Data.Char
36import Data.Char
37import Data.Data (Data)
37import Data.Data (Data)
38import Data.Foldable (traverse_)
38import Data.Foldable (traverse_)
@@ -44,7 +44,6 @@ import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
44import Data.Int
44import Data.Int
45import Data.IntSet (IntSet)
45import Data.IntSet (IntSet)
46import Data.IntMap (IntMap)
46import Data.IntMap (IntMap)
47−import Data.List.NonEmpty.Compat (NonEmpty)
48import Data.Map (Map)
47import Data.Map (Map)
49import Data.Proxy
48import Data.Proxy
50import Data.Scientific (Scientific)
49import Data.Scientific (Scientific)
@@ -57,8 +56,7 @@ import qualified Data.Vector as V
57import qualified Data.Vector.Primitive as VP
56import qualified Data.Vector.Primitive as VP
58import qualified Data.Vector.Storable as VS
57import qualified Data.Vector.Storable as VS
59import qualified Data.Vector.Unboxed as VU
58import qualified Data.Vector.Unboxed as VU
60−import Data.Version (Version)
61−import Numeric.Natural.Compat (Natural)
59+import Numeric.Natural
62import Data.Word
60import Data.Word
63import GHC.Generics
61import GHC.Generics
64import qualified Data.UUID.Types as UUID
62import qualified Data.UUID.Types as UUID
@@ -111,7 +109,7 @@ rename name (NamedSchema _ schema) = NamedSchema name schema
111-- declareNamedSchema _ = do
109-- declareNamedSchema _ = do
112-- doubleSchema <- declareSchemaRef (Proxy :: Proxy Double)
110-- doubleSchema <- declareSchemaRef (Proxy :: Proxy Double)
113-- return $ NamedSchema (Just \"Coord\") $ mempty
111-- return $ NamedSchema (Just \"Coord\") $ mempty
114−-- & type_ ?~ SwaggerObject
112+-- & type_ .~ SwaggerObject
115-- & properties .~
113-- & properties .~
116-- [ (\"x\", doubleSchema)
114-- [ (\"x\", doubleSchema)
117-- , (\"y\", doubleSchema)
115-- , (\"y\", doubleSchema)
@@ -142,17 +140,13 @@ class ToSchema a where
142 -- together with all used definitions.
140 -- together with all used definitions.
143 -- Note that the schema itself is included in definitions
141 -- Note that the schema itself is included in definitions
144 -- only if it is recursive (and thus needs its definition in scope).
142 -- only if it is recursive (and thus needs its definition in scope).
145− declareNamedSchema :: Proxy a -> Declare (Definitions Schema) NamedSchema
143+ declareNamedSchema :: proxy a -> Declare (Definitions Schema) NamedSchema
146 default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
144 default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
147− Proxy a -> Declare (Definitions Schema) NamedSchema
145+ proxy a -> Declare (Definitions Schema) NamedSchema
148 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
146 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
150−instance ToSchema TimeOfDay where
151− declareNamedSchema _ = pure $ named "TimeOfDay" $ timeSchema "hh:MM:ss"
152− & example ?~ toJSON (TimeOfDay 12 33 15)
154-- | Convert a type into a schema and declare all used schema definitions.
148-- | Convert a type into a schema and declare all used schema definitions.
155−declareSchema :: ToSchema a => Proxy a -> Declare (Definitions Schema) Schema
149+declareSchema :: ToSchema a => proxy a -> Declare (Definitions Schema) Schema
156declareSchema = fmap _namedSchemaSchema . declareNamedSchema
150declareSchema = fmap _namedSchemaSchema . declareNamedSchema
158-- | Convert a type into an optionally named schema.
152-- | Convert a type into an optionally named schema.
@@ -166,7 +160,7 @@ declareSchema = fmap _namedSchemaSchema . declareNamedSchema
166-- Just "Day"
160-- Just "Day"
167-- >>> encode (toNamedSchema (Proxy :: Proxy Day) ^. schema)
161-- >>> encode (toNamedSchema (Proxy :: Proxy Day) ^. schema)
168-- "{\"example\":\"2016-07-22\",\"format\":\"date\",\"type\":\"string\"}"
162-- "{\"example\":\"2016-07-22\",\"format\":\"date\",\"type\":\"string\"}"
169−toNamedSchema :: ToSchema a => Proxy a -> NamedSchema
163+toNamedSchema :: ToSchema a => proxy a -> NamedSchema
170toNamedSchema = undeclare . declareNamedSchema
164toNamedSchema = undeclare . declareNamedSchema
172-- | Get type's schema name according to its @'ToSchema'@ instance.
166-- | Get type's schema name according to its @'ToSchema'@ instance.
@@ -176,7 +170,7 @@ toNamedSchema = undeclare . declareNamedSchema
177-- >>> schemaName (Proxy :: Proxy UTCTime)
171-- >>> schemaName (Proxy :: Proxy UTCTime)
178-- Just "UTCTime"
172-- Just "UTCTime"
179−schemaName :: ToSchema a => Proxy a -> Maybe T.Text
173+schemaName :: ToSchema a => proxy a -> Maybe T.Text
180schemaName = _namedSchemaName . toNamedSchema
174schemaName = _namedSchemaName . toNamedSchema
182-- | Convert a type into a schema.
176-- | Convert a type into a schema.
@@ -186,7 +180,7 @@ schemaName = _namedSchemaName . toNamedSchema
187-- >>> encode $ toSchema (Proxy :: Proxy [Day])
181-- >>> encode $ toSchema (Proxy :: Proxy [Day])
188-- "{\"items\":{\"$ref\":\"#/definitions/Day\"},\"type\":\"array\"}"
182-- "{\"items\":{\"$ref\":\"#/definitions/Day\"},\"type\":\"array\"}"
189−toSchema :: ToSchema a => Proxy a -> Schema
183+toSchema :: ToSchema a => proxy a -> Schema
190toSchema = _namedSchemaSchema . toNamedSchema
184toSchema = _namedSchemaSchema . toNamedSchema
192-- | Convert a type into a referenced schema if possible.
186-- | Convert a type into a referenced schema if possible.
@@ -197,7 +191,7 @@ toSchema = _namedSchemaSchema . toNamedSchema
198-- >>> encode $ toSchemaRef (Proxy :: Proxy Day)
192-- >>> encode $ toSchemaRef (Proxy :: Proxy Day)
199-- "{\"$ref\":\"#/definitions/Day\"}"
193-- "{\"$ref\":\"#/definitions/Day\"}"
200−toSchemaRef :: ToSchema a => Proxy a -> Referenced Schema
194+toSchemaRef :: ToSchema a => proxy a -> Referenced Schema
201toSchemaRef = undeclare . declareSchemaRef
195toSchemaRef = undeclare . declareSchemaRef
203-- | Convert a type into a referenced schema if possible
197-- | Convert a type into a referenced schema if possible
@@ -207,7 +201,7 @@ toSchemaRef = undeclare . declareSchemaRef
207-- Schema definitions are typically declared for every referenced schema.
201-- Schema definitions are typically declared for every referenced schema.
208-- If @'declareSchemaRef'@ returns a reference, a corresponding schema
202-- If @'declareSchemaRef'@ returns a reference, a corresponding schema
209-- will be declared (regardless of whether it is recusive or not).
203-- will be declared (regardless of whether it is recusive or not).
210−declareSchemaRef :: ToSchema a => Proxy a -> Declare (Definitions Schema) (Referenced Schema)
204+declareSchemaRef :: ToSchema a => proxy a -> Declare (Definitions Schema) (Referenced Schema)
211declareSchemaRef proxy = do
205declareSchemaRef proxy = do
212 case toNamedSchema proxy of
206 case toNamedSchema proxy of
213 NamedSchema (Just name) schema -> do
207 NamedSchema (Just name) schema -> do
@@ -269,7 +263,7 @@ inlineAllSchemas = inlineSchemasWhen (const True)
270-- __WARNING:__ @'toInlinedSchema'@ will produce infinite schema
264-- __WARNING:__ @'toInlinedSchema'@ will produce infinite schema
271-- when inlining recursive schemas.
265-- when inlining recursive schemas.
272−toInlinedSchema :: ToSchema a => Proxy a -> Schema
266+toInlinedSchema :: ToSchema a => proxy a -> Schema
273toInlinedSchema proxy = inlineAllSchemas defs schema
267toInlinedSchema proxy = inlineAllSchemas defs schema
275 (defs, schema) = runDeclare (declareSchema proxy) mempty
269 (defs, schema) = runDeclare (declareSchema proxy) mempty
@@ -298,20 +292,20 @@ inlineNonRecursiveSchemas defs = inlineSchemasWhen nonRecursive defs
298-- | Default schema for binary data (any sequence of octets).
292-- | Default schema for binary data (any sequence of octets).
299binarySchema :: Schema
293binarySchema :: Schema
300binarySchema = mempty
294binarySchema = mempty
301− & type_ ?~ SwaggerString
295+ & type_ .~ SwaggerString
302 & format ?~ "binary"
296 & format ?~ "binary"
304-- | Default schema for binary data (base64 encoded).
298-- | Default schema for binary data (base64 encoded).
305byteSchema :: Schema
299byteSchema :: Schema
306byteSchema = mempty
300byteSchema = mempty
307− & type_ ?~ SwaggerString
301+ & type_ .~ SwaggerString
308 & format ?~ "byte"
302 & format ?~ "byte"
310-- | Default schema for password string.
304-- | Default schema for password string.
311-- @"password"@ format is used to hint UIs the input needs to be obscured.
305-- @"password"@ format is used to hint UIs the input needs to be obscured.
312passwordSchema :: Schema
306passwordSchema :: Schema
313passwordSchema = mempty
307passwordSchema = mempty
314− & type_ ?~ SwaggerString
308+ & type_ .~ SwaggerString
315 & format ?~ "password"
309 & format ?~ "password"
317-- | Make an unrestrictive sketch of a @'Schema'@ based on a @'ToJSON'@ instance.
311-- | Make an unrestrictive sketch of a @'Schema'@ based on a @'ToJSON'@ instance.
@@ -337,12 +331,12 @@ sketchSchema = sketch . toJSON
337 sketch js@(Bool _) = go js
331 sketch js@(Bool _) = go js
338 sketch js = go js & example ?~ js
332 sketch js = go js & example ?~ js
340− go Null = mempty & type_ ?~ SwaggerNull
334+ go Null = mempty & type_ .~ SwaggerNull
341− go (Bool _) = mempty & type_ ?~ SwaggerBoolean
335+ go (Bool _) = mempty & type_ .~ SwaggerBoolean
342− go (String _) = mempty & type_ ?~ SwaggerString
336+ go (String _) = mempty & type_ .~ SwaggerString
343− go (Number _) = mempty & type_ ?~ SwaggerNumber
337+ go (Number _) = mempty & type_ .~ SwaggerNumber
344 go (Array xs) = mempty
338 go (Array xs) = mempty
345− & type_ ?~ SwaggerArray
339+ & type_ .~ SwaggerArray
346 & items ?~ case ischema of
340 & items ?~ case ischema of
347 Just s -> SwaggerItemsObject (Inline s)
341 Just s -> SwaggerItemsObject (Inline s)
348 _ -> SwaggerItemsArray (map Inline ys)
342 _ -> SwaggerItemsArray (map Inline ys)
@@ -354,7 +348,7 @@ sketchSchema = sketch . toJSON
354 (z:_) | allSame -> Just z
348 (z:_) | allSame -> Just z
355 _ -> Nothing
349 _ -> Nothing
356 go (Object o) = mempty
350 go (Object o) = mempty
357− & type_ ?~ SwaggerObject
351+ & type_ .~ SwaggerObject
358 & required .~ HashMap.keys o
352 & required .~ HashMap.keys o
359 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
353 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
@@ -377,24 +371,24 @@ sketchSchema = sketch . toJSON
377sketchStrictSchema :: ToJSON a => a -> Schema
371sketchStrictSchema :: ToJSON a => a -> Schema
378sketchStrictSchema = go . toJSON
372sketchStrictSchema = go . toJSON
380− go Null = mempty & type_ ?~ SwaggerNull
374+ go Null = mempty & type_ .~ SwaggerNull
381 go js@(Bool _) = mempty
375 go js@(Bool _) = mempty
382− & type_ ?~ SwaggerBoolean
376+ & type_ .~ SwaggerBoolean
383 & enum_ ?~ [js]
377 & enum_ ?~ [js]
384 go js@(String s) = mempty
378 go js@(String s) = mempty
385− & type_ ?~ SwaggerString
379+ & type_ .~ SwaggerString
386 & maxLength ?~ fromIntegral (T.length s)
380 & maxLength ?~ fromIntegral (T.length s)
387 & minLength ?~ fromIntegral (T.length s)
381 & minLength ?~ fromIntegral (T.length s)
388 & pattern ?~ s
382 & pattern ?~ s
389 & enum_ ?~ [js]
383 & enum_ ?~ [js]
390 go js@(Number n) = mempty
384 go js@(Number n) = mempty
391− & type_ ?~ SwaggerNumber
385+ & type_ .~ SwaggerNumber
392 & maximum_ ?~ n
386 & maximum_ ?~ n
393 & minimum_ ?~ n
387 & minimum_ ?~ n
394 & multipleOf ?~ n
388 & multipleOf ?~ n
395 & enum_ ?~ [js]
389 & enum_ ?~ [js]
396 go js@(Array xs) = mempty
390 go js@(Array xs) = mempty
397− & type_ ?~ SwaggerArray
391+ & type_ .~ SwaggerArray
398 & maxItems ?~ fromIntegral sz
392 & maxItems ?~ fromIntegral sz
399 & minItems ?~ fromIntegral sz
393 & minItems ?~ fromIntegral sz
400 & items ?~ SwaggerItemsArray (map (Inline . go) (V.toList xs))
394 & items ?~ SwaggerItemsArray (map (Inline . go) (V.toList xs))
@@ -404,7 +398,7 @@ sketchStrictSchema = go . toJSON
404 sz = length xs
398 sz = length xs
405 allUnique = sz == HashSet.size (HashSet.fromList (V.toList xs))
399 allUnique = sz == HashSet.size (HashSet.fromList (V.toList xs))
406 go js@(Object o) = mempty
400 go js@(Object o) = mempty
407− & type_ ?~ SwaggerObject
401+ & type_ .~ SwaggerObject
408 & required .~ names
402 & required .~ names
409 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
403 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
410 & maxProperties ?~ fromIntegral (length names)
404 & maxProperties ?~ fromIntegral (length names)
@@ -414,13 +408,13 @@ sketchStrictSchema = go . toJSON
414 names = HashMap.keys o
408 names = HashMap.keys o
416class GToSchema (f :: * -> *) where
410class GToSchema (f :: * -> *) where
417− gdeclareNamedSchema :: SchemaOptions -> Proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
411+ gdeclareNamedSchema :: SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
419instance OVERLAPPABLE_ ToSchema a => ToSchema [a] where
413instance OVERLAPPABLE_ ToSchema a => ToSchema [a] where
420 declareNamedSchema _ = do
414 declareNamedSchema _ = do
421 ref <- declareSchemaRef (Proxy :: Proxy a)
415 ref <- declareSchemaRef (Proxy :: Proxy a)
422 return $ unnamed $ mempty
416 return $ unnamed $ mempty
423− & type_ ?~ SwaggerArray
417+ & type_ .~ SwaggerArray
424 & items ?~ SwaggerItemsObject ref
418 & items ?~ SwaggerItemsObject ref
426instance OVERLAPPING_ ToSchema String where declareNamedSchema = plain . paramSchemaToSchema
420instance OVERLAPPING_ ToSchema String where declareNamedSchema = plain . paramSchemaToSchema
@@ -470,7 +464,7 @@ instance (ToSchema a, ToSchema b, ToSchema c, ToSchema d, ToSchema e, ToSchema f
471timeSchema :: T.Text -> Schema
465timeSchema :: T.Text -> Schema
472timeSchema fmt = mempty
466timeSchema fmt = mempty
473− & type_ ?~ SwaggerString
467+ & type_ .~ SwaggerString
474 & format ?~ fmt
468 & format ?~ fmt
476-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format.
470-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format.
@@ -503,8 +497,6 @@ instance ToSchema UTCTime where
503instance ToSchema T.Text where declareNamedSchema = plain . paramSchemaToSchema
497instance ToSchema T.Text where declareNamedSchema = plain . paramSchemaToSchema
504instance ToSchema TL.Text where declareNamedSchema = plain . paramSchemaToSchema
498instance ToSchema TL.Text where declareNamedSchema = plain . paramSchemaToSchema
506−instance ToSchema Version where declareNamedSchema = plain . paramSchemaToSchema
508#if __GLASGOW_HASKELL__ < 800
500#if __GLASGOW_HASKELL__ < 800
510type family ToSchemaByteStringError bs where
502type family ToSchemaByteStringError bs where
@@ -532,8 +524,8 @@ instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (Map k v) where
532 declareObjectMapSchema = do
524 declareObjectMapSchema = do
533 schema <- declareSchemaRef (Proxy :: Proxy v)
525 schema <- declareSchemaRef (Proxy :: Proxy v)
534 return $ unnamed $ mempty
526 return $ unnamed $ mempty
535− & type_ ?~ SwaggerObject
527+ & type_ .~ SwaggerObject
536− & additionalProperties ?~ AdditionalPropertiesSchema schema
528+ & additionalProperties ?~ schema
538instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (HashMap k v) where
530instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (HashMap k v) where
539 declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map k v))
531 declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map k v))
@@ -544,7 +536,7 @@ instance ToSchema a => ToSchema (Map String a) where
544 declareNamedSchema _ = do
536 declareNamedSchema _ = do
545 schema <- declareSchemaRef (Proxy :: Proxy a)
537 schema <- declareSchemaRef (Proxy :: Proxy a)
546 return $ unnamed $ mempty
538 return $ unnamed $ mempty
547− & type_ ?~ SwaggerObject
539+ & type_ .~ SwaggerObject
548 & additionalProperties ?~ schema
540 & additionalProperties ?~ schema
550instance ToSchema a => ToSchema (Map T.Text a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map String a))
542instance ToSchema a => ToSchema (Map T.Text a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map String a))
@@ -556,12 +548,6 @@ instance ToSchema a => ToSchema (HashMap TL.Text a) where declareNamedSchema _ =
559−instance OVERLAPPING_ ToSchema Object where
560− declareNamedSchema _ = pure $ NamedSchema (Just "Object") $ mempty
561− & type_ ?~ SwaggerObject
562− & description ?~ "Arbitrary JSON object."
563− & additionalProperties ?~ AdditionalPropertiesAllowed True
565instance ToSchema a => ToSchema (V.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
551instance ToSchema a => ToSchema (V.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
566instance ToSchema a => ToSchema (VU.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
552instance ToSchema a => ToSchema (VU.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
567instance ToSchema a => ToSchema (VS.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
553instance ToSchema a => ToSchema (VS.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
@@ -575,13 +561,6 @@ instance ToSchema a => ToSchema (Set a) where
576instance ToSchema a => ToSchema (HashSet a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Set a))
562instance ToSchema a => ToSchema (HashSet a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Set a))
579−instance ToSchema a => ToSchema (NonEmpty a) where
580− declareNamedSchema _ = do
581− schema <- declareSchema (Proxy :: Proxy [a])
582− return $ unnamed $ schema
583− & minItems .~ Just 1
585instance ToSchema All where declareNamedSchema = plain . paramSchemaToSchema
564instance ToSchema All where declareNamedSchema = plain . paramSchemaToSchema
586instance ToSchema Any where declareNamedSchema = plain . paramSchemaToSchema
565instance ToSchema Any where declareNamedSchema = plain . paramSchemaToSchema
@@ -597,135 +576,74 @@ instance ToSchema a => ToSchema (Identity a) where declareNamedSchema _ = declar
598-- >>> encode $ toSchemaBoundedIntegral (Proxy :: Proxy Int16)
577-- >>> encode $ toSchemaBoundedIntegral (Proxy :: Proxy Int16)
599-- "{\"maximum\":32767,\"minimum\":-32768,\"type\":\"integer\"}"
578-- "{\"maximum\":32767,\"minimum\":-32768,\"type\":\"integer\"}"
600−toSchemaBoundedIntegral :: forall a. (Bounded a, Integral a) => Proxy a -> Schema
579+toSchemaBoundedIntegral :: forall a proxy. (Bounded a, Integral a) => proxy a -> Schema
601toSchemaBoundedIntegral _ = mempty
580toSchemaBoundedIntegral _ = mempty
602− & type_ ?~ SwaggerInteger
581+ & type_ .~ SwaggerInteger
603 & minimum_ ?~ fromInteger (toInteger (minBound :: a))
582 & minimum_ ?~ fromInteger (toInteger (minBound :: a))
604 & maximum_ ?~ fromInteger (toInteger (maxBound :: a))
583 & maximum_ ?~ fromInteger (toInteger (maxBound :: a))
606-- | Default generic named schema for @'Bounded'@, @'Integral'@ types.
585-- | Default generic named schema for @'Bounded'@, @'Integral'@ types.
607−genericToNamedSchemaBoundedIntegral :: forall a d f.
586+genericToNamedSchemaBoundedIntegral :: forall a d f proxy.
608 ( Bounded a, Integral a
587 ( Bounded a, Integral a
609 , Generic a, Rep a ~ D1 d f, Datatype d)
588 , Generic a, Rep a ~ D1 d f, Datatype d)
610− => SchemaOptions -> Proxy a -> NamedSchema
589+ => SchemaOptions -> proxy a -> NamedSchema
611genericToNamedSchemaBoundedIntegral opts proxy
590genericToNamedSchemaBoundedIntegral opts proxy
612− = genericNameSchema opts proxy (toSchemaBoundedIntegral proxy)
591+ = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (toSchemaBoundedIntegral proxy)
614−-- | Declare a named schema for a @newtype@ wrapper.
615−genericDeclareNamedSchemaNewtype :: forall a d c s i inner.
616− (Generic a, Datatype d, Rep a ~ D1 d (C1 c (S1 s (K1 i inner))))
617− => SchemaOptions -- ^ How to derive the name.
618− -> (Proxy inner -> Declare (Definitions Schema) Schema) -- ^ How to create a schema for the wrapped type.
620− -> Declare (Definitions Schema) NamedSchema
621−genericDeclareNamedSchemaNewtype opts f proxy = genericNameSchema opts proxy <$> f (Proxy :: Proxy inner)
623−-- | Declare 'Schema' for a mapping with 'Bounded' 'Enum' keys.
624−-- This makes a much more useful schema when there aren't many options for key values.
626−-- >>> data ButtonState = Neutral | Focus | Active | Hover | Disabled deriving (Show, Bounded, Enum, Generic)
627−-- >>> instance ToJSON ButtonState
628−-- >>> instance ToSchema ButtonState
629−-- >>> instance ToJSONKey ButtonState where toJSONKey = toJSONKeyText (T.pack . show)
630−-- >>> type ImageUrl = T.Text
631−-- >>> encode $ toSchemaBoundedEnumKeyMapping (Proxy :: Proxy (Map ButtonState ImageUrl))
632−-- "{\"properties\":{\"Neutral\":{\"type\":\"string\"},\"Focus\":{\"type\":\"string\"},\"Active\":{\"type\":\"string\"},\"Hover\":{\"type\":\"string\"},\"Disabled\":{\"type\":\"string\"}},\"type\":\"object\"}"
634−-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
635−-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
636−declareSchemaBoundedEnumKeyMapping :: forall map key value.
637− (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
638− => Proxy (map key value) -> Declare (Definitions Schema) Schema
639−declareSchemaBoundedEnumKeyMapping _ = case toJSONKey :: ToJSONKeyFunction key of
640− ToJSONKeyText keyToText _ -> objectSchema keyToText
641− ToJSONKeyValue _ _ -> declareSchema (Proxy :: Proxy [(key, value)])
643− objectSchema keyToText = do
644− valueRef <- declareSchemaRef (Proxy :: Proxy value)
645− let allKeys = [minBound..maxBound :: key]
646− mkPair k = (keyToText k, valueRef)
648− & type_ ?~ SwaggerObject
649− & properties .~ InsOrdHashMap.fromList (map mkPair allKeys)
651−-- | A 'Schema' for a mapping with 'Bounded' 'Enum' keys.
652−-- This makes a much more useful schema when there aren't many options for key values.
654−-- >>> data ButtonState = Neutral | Focus | Active | Hover | Disabled deriving (Show, Bounded, Enum, Generic)
655−-- >>> instance ToJSON ButtonState
656−-- >>> instance ToSchema ButtonState
657−-- >>> instance ToJSONKey ButtonState where toJSONKey = toJSONKeyText (T.pack . show)
658−-- >>> type ImageUrl = T.Text
659−-- >>> encode $ toSchemaBoundedEnumKeyMapping (Proxy :: Proxy (Map ButtonState ImageUrl))
660−-- "{\"properties\":{\"Neutral\":{\"type\":\"string\"},\"Focus\":{\"type\":\"string\"},\"Active\":{\"type\":\"string\"},\"Hover\":{\"type\":\"string\"},\"Disabled\":{\"type\":\"string\"}},\"type\":\"object\"}"
662−-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
663−-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
664−toSchemaBoundedEnumKeyMapping :: forall map key value.
665− (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
666− => Proxy (map key value) -> Schema
667−toSchemaBoundedEnumKeyMapping = flip evalDeclare mempty . declareSchemaBoundedEnumKeyMapping
669-- | A configurable generic @'Schema'@ creator.
593-- | A configurable generic @'Schema'@ creator.
670genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
594genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
671− SchemaOptions -> Proxy a -> Declare (Definitions Schema) Schema
595+ SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
672genericDeclareSchema = genericDeclareSchemaUnrestricted
596genericDeclareSchema = genericDeclareSchemaUnrestricted
674-- | A configurable generic @'NamedSchema'@ creator.
598-- | A configurable generic @'NamedSchema'@ creator.
675-- This function applied to @'defaultSchemaOptions'@
599-- This function applied to @'defaultSchemaOptions'@
676-- is used as the default for @'declareNamedSchema'@
600-- is used as the default for @'declareNamedSchema'@
677-- when the type is an instance of @'Generic'@.
601-- when the type is an instance of @'Generic'@.
678−genericDeclareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
602+genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
679− SchemaOptions -> Proxy a -> Declare (Definitions Schema) NamedSchema
603+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
680genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
604genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
682-- | A configurable generic @'Schema'@ creator.
606-- | A configurable generic @'Schema'@ creator.
684-- Unlike 'genericDeclareSchema' also works for mixed sum types.
608-- Unlike 'genericDeclareSchema' also works for mixed sum types.
685-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
609-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
686−genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> Proxy a -> Declare (Definitions Schema) Schema
610+genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
687genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
611genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
689-- | A configurable generic @'NamedSchema'@ creator.
613-- | A configurable generic @'NamedSchema'@ creator.
691-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
615-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
692-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
616-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
693−genericDeclareNamedSchemaUnrestricted :: forall a. (Generic a, GToSchema (Rep a)) =>
617+genericDeclareNamedSchemaUnrestricted :: forall a proxy. (Generic a, GToSchema (Rep a)) =>
694− SchemaOptions -> Proxy a -> Declare (Definitions Schema) NamedSchema
618+ SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
695genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
619genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
697−-- | Derive a 'Generic'-based name for a datatype and assign it to a given 'Schema'.
698−genericNameSchema :: forall a d f.
699− (Generic a, Rep a ~ D1 d f, Datatype d)
700− => SchemaOptions -> Proxy a -> Schema -> NamedSchema
701−genericNameSchema opts _ = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d))
703−gdatatypeSchemaName :: forall d. Datatype d => SchemaOptions -> Proxy d -> Maybe T.Text
621+gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
704−gdatatypeSchemaName opts _ = case orig of
622+gdatatypeSchemaName opts _ = case name of
705 (c:_) | isAlpha c && isUpper c -> Just (T.pack name)
623 (c:_) | isAlpha c && isUpper c -> Just (T.pack name)
706 _ -> Nothing
624 _ -> Nothing
708− orig = datatypeName (Proxy3 :: Proxy3 d f a)
626+ name = datatypeNameModifier opts (datatypeName (Proxy3 :: Proxy3 d f a))
709− name = datatypeNameModifier opts orig
711-- | Lift a plain @'ParamSchema'@ into a model @'NamedSchema'@.
628-- | Lift a plain @'ParamSchema'@ into a model @'NamedSchema'@.
629+paramSchemaToNamedSchema :: forall a d f proxy.
712−paramSchemaToNamedSchema :: (ToParamSchema a, Generic a, Rep a ~ D1 d f, Datatype d) =>
630+ (ToParamSchema a, Generic a, Rep a ~ D1 d f, Datatype d)
713− SchemaOptions -> Proxy a -> NamedSchema
631+ => SchemaOptions -> proxy a -> NamedSchema
714−paramSchemaToNamedSchema opts proxy = genericNameSchema opts proxy (paramSchemaToSchema proxy)
632+paramSchemaToNamedSchema opts proxy = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d)) (paramSchemaToSchema proxy)
716-- | Lift a plain @'ParamSchema'@ into a model @'Schema'@.
634-- | Lift a plain @'ParamSchema'@ into a model @'Schema'@.
717−paramSchemaToSchema :: ToParamSchema a => Proxy a -> Schema
635+paramSchemaToSchema :: forall a proxy. ToParamSchema a => proxy a -> Schema
718−paramSchemaToSchema proxy = mempty & paramSchema .~ toParamSchema proxy
636+paramSchemaToSchema _ = mempty & paramSchema .~ toParamSchema (Proxy :: Proxy a)
720nullarySchema :: Schema
638nullarySchema :: Schema
721nullarySchema = mempty
639nullarySchema = mempty
722− & type_ ?~ SwaggerArray
640+ & type_ .~ SwaggerArray
723 & items ?~ SwaggerItemsArray []
641 & items ?~ SwaggerItemsArray []
725−gtoNamedSchema :: GToSchema f => SchemaOptions -> Proxy f -> NamedSchema
643+gtoNamedSchema :: GToSchema f => SchemaOptions -> proxy f -> NamedSchema
726gtoNamedSchema opts proxy = undeclare $ gdeclareNamedSchema opts proxy mempty
644gtoNamedSchema opts proxy = undeclare $ gdeclareNamedSchema opts proxy mempty
728−gdeclareSchema :: GToSchema f => SchemaOptions -> Proxy f -> Declare (Definitions Schema) Schema
646+gdeclareSchema :: GToSchema f => SchemaOptions -> proxy f -> Declare (Definitions Schema) Schema
729gdeclareSchema opts proxy = _namedSchemaSchema <$> gdeclareNamedSchema opts proxy mempty
647gdeclareSchema opts proxy = _namedSchemaSchema <$> gdeclareNamedSchema opts proxy mempty
731instance (GToSchema f, GToSchema g) => GToSchema (f :*: g) where
649instance (GToSchema f, GToSchema g) => GToSchema (f :*: g) where
@@ -745,7 +663,7 @@ instance OVERLAPPING_ Constructor c => GToSchema (C1 c U1) where
745 gdeclareNamedSchema = gdeclareNamedSumSchema
663 gdeclareNamedSchema = gdeclareNamedSumSchema
747-- | Single field constructor.
665-- | Single field constructor.
748−instance (Selector s, GToSchema f, GToSchema (S1 s f)) => GToSchema (C1 c (S1 s f)) where
666+instance (Selector s, GToSchema f) => GToSchema (C1 c (S1 s f)) where
749 gdeclareNamedSchema opts _ s
667 gdeclareNamedSchema opts _ s
750 | unwrapUnaryRecords opts = fieldSchema
668 | unwrapUnaryRecords opts = fieldSchema
751 | otherwise =
669 | otherwise =
@@ -759,7 +677,7 @@ instance (Selector s, GToSchema f, GToSchema (S1 s f)) => GToSchema (C1 c (S1 s
759 recordSchema = gdeclareNamedSchema opts (Proxy :: Proxy (S1 s f)) s
677 recordSchema = gdeclareNamedSchema opts (Proxy :: Proxy (S1 s f)) s
760 fieldSchema = gdeclareNamedSchema opts (Proxy :: Proxy f) s
678 fieldSchema = gdeclareNamedSchema opts (Proxy :: Proxy f) s
762−gdeclareSchemaRef :: GToSchema a => SchemaOptions -> Proxy a -> Declare (Definitions Schema) (Referenced Schema)
680+gdeclareSchemaRef :: GToSchema a => SchemaOptions -> proxy a -> Declare (Definitions Schema) (Referenced Schema)
763gdeclareSchemaRef opts proxy = do
681gdeclareSchemaRef opts proxy = do
764 case gtoNamedSchema opts proxy of
682 case gtoNamedSchema opts proxy of
765 NamedSchema (Just name) schema -> do
683 NamedSchema (Just name) schema -> do
@@ -790,12 +708,12 @@ withFieldSchema opts _ isRequiredField schema = do
791 if T.null fname
709 if T.null fname
792 then schema
710 then schema
793− & type_ ?~ SwaggerArray
711+ & type_ .~ SwaggerArray
794 & items %~ appendItem ref
712 & items %~ appendItem ref
795 & maxItems %~ Just . maybe 1 (+1) -- increment maxItems
713 & maxItems %~ Just . maybe 1 (+1) -- increment maxItems
796 & minItems %~ Just . maybe 1 (+1) -- increment minItems
714 & minItems %~ Just . maybe 1 (+1) -- increment minItems
797 else schema
715 else schema
798− & type_ ?~ SwaggerObject
716+ & type_ .~ SwaggerObject
799 & properties . at fname ?~ ref
717 & properties . at fname ?~ ref
800 & if isRequiredField
718 & if isRequiredField
801 then required %~ (++ [fname])
719 then required %~ (++ [fname])
@@ -823,7 +741,7 @@ instance ( GSumToSchema f
824 gdeclareNamedSchema = gdeclareNamedSumSchema
742 gdeclareNamedSchema = gdeclareNamedSumSchema
826−gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> Proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
744+gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
827gdeclareNamedSumSchema opts proxy s
745gdeclareNamedSumSchema opts proxy s
828 | allNullaryToStringTag opts && allNullary = pure $ unnamed (toStringTag sumSchema)
746 | allNullaryToStringTag opts && allNullary = pure $ unnamed (toStringTag sumSchema)
829 | otherwise = (unnamed . fst) <$> runWriterT declareSumSchema
747 | otherwise = (unnamed . fst) <$> runWriterT declareSumSchema
@@ -832,29 +750,29 @@ gdeclareNamedSumSchema opts proxy s
832 (sumSchema, All allNullary) = undeclare (runWriterT declareSumSchema)
750 (sumSchema, All allNullary) = undeclare (runWriterT declareSumSchema)
834 toStringTag schema = mempty
752 toStringTag schema = mempty
835− & type_ ?~ SwaggerString
753+ & type_ .~ SwaggerString
836 & enum_ ?~ map toJSON (schema ^.. properties.ifolded.asIndex)
754 & enum_ ?~ map toJSON (schema ^.. properties.ifolded.asIndex)
838type AllNullary = All
756type AllNullary = All
840class GSumToSchema (f :: * -> *) where
758class GSumToSchema (f :: * -> *) where
841− gsumToSchema :: SchemaOptions -> Proxy f -> Schema -> WriterT AllNullary (Declare (Definitions Schema)) Schema
759+ gsumToSchema :: SchemaOptions -> proxy f -> Schema -> WriterT AllNullary (Declare (Definitions Schema)) Schema
843instance (GSumToSchema f, GSumToSchema g) => GSumToSchema (f :+: g) where
761instance (GSumToSchema f, GSumToSchema g) => GSumToSchema (f :+: g) where
844 gsumToSchema opts _ = gsumToSchema opts (Proxy :: Proxy f) >=> gsumToSchema opts (Proxy :: Proxy g)
762 gsumToSchema opts _ = gsumToSchema opts (Proxy :: Proxy f) >=> gsumToSchema opts (Proxy :: Proxy g)
846−gsumConToSchemaWith :: forall c f. (GToSchema (C1 c f), Constructor c) =>
764+gsumConToSchemaWith :: forall c f proxy. (GToSchema (C1 c f), Constructor c) =>
847− Referenced Schema -> SchemaOptions -> Proxy (C1 c f) -> Schema -> Schema
765+ Referenced Schema -> SchemaOptions -> proxy (C1 c f) -> Schema -> Schema
848gsumConToSchemaWith ref opts _ schema = schema
766gsumConToSchemaWith ref opts _ schema = schema
849− & type_ ?~ SwaggerObject
767+ & type_ .~ SwaggerObject
850 & properties . at tag ?~ ref
768 & properties . at tag ?~ ref
851 & maxProperties ?~ 1
769 & maxProperties ?~ 1
852 & minProperties ?~ 1
770 & minProperties ?~ 1
854 tag = T.pack (constructorTagModifier opts (conName (Proxy3 :: Proxy3 c f p)))
772 tag = T.pack (constructorTagModifier opts (conName (Proxy3 :: Proxy3 c f p)))
856−gsumConToSchema :: (GToSchema (C1 c f), Constructor c) =>
774+gsumConToSchema :: forall c f proxy. (GToSchema (C1 c f), Constructor c) =>
857− SchemaOptions -> Proxy (C1 c f) -> Schema -> Declare (Definitions Schema) Schema
775+ SchemaOptions -> proxy (C1 c f) -> Schema -> Declare (Definitions Schema) Schema
858gsumConToSchema opts proxy schema = do
776gsumConToSchema opts proxy schema = do
859 ref <- gdeclareSchemaRef opts proxy
777 ref <- gdeclareSchemaRef opts proxy
860 return $ gsumConToSchemaWith ref opts proxy schema
778 return $ gsumConToSchemaWith ref opts proxy schema
@@ -879,4 +797,3 @@ data Proxy3 a b c = Proxy3
880-- >>> import Data.Swagger
798-- >>> import Data.Swagger
881-- >>> import Data.Aeson (encode)
799-- >>> import Data.Aeson (encode)
882−-- >>> import Data.Aeson.Types (toJSONKeyText)