@@ -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 (..))
35+import Data.Aeson (ToJSON (..), ToJSONKey (..), ToJSONKeyFunction (..), Value (..), Object(..))
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,7 @@ 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 (NonEmpty)
47+import Data.List.NonEmpty.Compat (NonEmpty)
48import Data.Map (Map)
48import Data.Map (Map)
49import Data.Proxy
49import Data.Proxy
50import Data.Scientific (Scientific)
50import Data.Scientific (Scientific)
@@ -58,7 +58,7 @@ import qualified Data.Vector.Primitive as VP
58import qualified Data.Vector.Storable as VS
58import qualified Data.Vector.Storable as VS
59import qualified Data.Vector.Unboxed as VU
59import qualified Data.Vector.Unboxed as VU
60import Data.Version (Version)
60import Data.Version (Version)
61−import Numeric.Natural
61+import Numeric.Natural.Compat (Natural)
62import Data.Word
62import Data.Word
63import GHC.Generics
63import GHC.Generics
64import qualified Data.UUID.Types as UUID
64import qualified Data.UUID.Types as UUID
@@ -111,7 +111,7 @@ rename name (NamedSchema _ schema) = NamedSchema name schema
111-- declareNamedSchema _ = do
111-- declareNamedSchema _ = do
112-- doubleSchema <- declareSchemaRef (Proxy :: Proxy Double)
112-- doubleSchema <- declareSchemaRef (Proxy :: Proxy Double)
113-- return $ NamedSchema (Just \"Coord\") $ mempty
113-- return $ NamedSchema (Just \"Coord\") $ mempty
114−-- & type_ .~ SwaggerObject
114+-- & type_ ?~ SwaggerObject
115-- & properties .~
115-- & properties .~
116-- [ (\"x\", doubleSchema)
116-- [ (\"x\", doubleSchema)
117-- , (\"y\", doubleSchema)
117-- , (\"y\", doubleSchema)
@@ -142,13 +142,17 @@ class ToSchema a where
142 -- together with all used definitions.
142 -- together with all used definitions.
143 -- Note that the schema itself is included in definitions
143 -- Note that the schema itself is included in definitions
144 -- only if it is recursive (and thus needs its definition in scope).
144 -- only if it is recursive (and thus needs its definition in scope).
145− declareNamedSchema :: proxy a -> Declare (Definitions Schema) NamedSchema
145+ declareNamedSchema :: Proxy a -> Declare (Definitions Schema) NamedSchema
146 default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
146 default declareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
147− proxy a -> Declare (Definitions Schema) NamedSchema
147+ Proxy a -> Declare (Definitions Schema) NamedSchema
148 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
148 declareNamedSchema = genericDeclareNamedSchema defaultSchemaOptions
150+instance ToSchema TimeOfDay where
151+ declareNamedSchema _ = pure $ named "TimeOfDay" $ timeSchema "hh:MM:ss"
152+ & example ?~ toJSON (TimeOfDay 12 33 15)
150-- | Convert a type into a schema and declare all used schema definitions.
154-- | Convert a type into a schema and declare all used schema definitions.
151−declareSchema :: ToSchema a => proxy a -> Declare (Definitions Schema) Schema
155+declareSchema :: ToSchema a => Proxy a -> Declare (Definitions Schema) Schema
152declareSchema = fmap _namedSchemaSchema . declareNamedSchema
156declareSchema = fmap _namedSchemaSchema . declareNamedSchema
154-- | Convert a type into an optionally named schema.
158-- | Convert a type into an optionally named schema.
@@ -162,7 +166,7 @@ declareSchema = fmap _namedSchemaSchema . declareNamedSchema
162-- Just "Day"
166-- Just "Day"
163-- >>> encode (toNamedSchema (Proxy :: Proxy Day) ^. schema)
167-- >>> encode (toNamedSchema (Proxy :: Proxy Day) ^. schema)
164-- "{\"example\":\"2016-07-22\",\"format\":\"date\",\"type\":\"string\"}"
168-- "{\"example\":\"2016-07-22\",\"format\":\"date\",\"type\":\"string\"}"
165−toNamedSchema :: ToSchema a => proxy a -> NamedSchema
169+toNamedSchema :: ToSchema a => Proxy a -> NamedSchema
166toNamedSchema = undeclare . declareNamedSchema
170toNamedSchema = undeclare . declareNamedSchema
168-- | Get type's schema name according to its @'ToSchema'@ instance.
172-- | Get type's schema name according to its @'ToSchema'@ instance.
@@ -172,7 +176,7 @@ toNamedSchema = undeclare . declareNamedSchema
173-- >>> schemaName (Proxy :: Proxy UTCTime)
177-- >>> schemaName (Proxy :: Proxy UTCTime)
174-- Just "UTCTime"
178-- Just "UTCTime"
175−schemaName :: ToSchema a => proxy a -> Maybe T.Text
179+schemaName :: ToSchema a => Proxy a -> Maybe T.Text
176schemaName = _namedSchemaName . toNamedSchema
180schemaName = _namedSchemaName . toNamedSchema
178-- | Convert a type into a schema.
182-- | Convert a type into a schema.
@@ -182,7 +186,7 @@ schemaName = _namedSchemaName . toNamedSchema
183-- >>> encode $ toSchema (Proxy :: Proxy [Day])
187-- >>> encode $ toSchema (Proxy :: Proxy [Day])
184-- "{\"items\":{\"$ref\":\"#/definitions/Day\"},\"type\":\"array\"}"
188-- "{\"items\":{\"$ref\":\"#/definitions/Day\"},\"type\":\"array\"}"
185−toSchema :: ToSchema a => proxy a -> Schema
189+toSchema :: ToSchema a => Proxy a -> Schema
186toSchema = _namedSchemaSchema . toNamedSchema
190toSchema = _namedSchemaSchema . toNamedSchema
188-- | Convert a type into a referenced schema if possible.
192-- | Convert a type into a referenced schema if possible.
@@ -193,7 +197,7 @@ toSchema = _namedSchemaSchema . toNamedSchema
194-- >>> encode $ toSchemaRef (Proxy :: Proxy Day)
198-- >>> encode $ toSchemaRef (Proxy :: Proxy Day)
195-- "{\"$ref\":\"#/definitions/Day\"}"
199-- "{\"$ref\":\"#/definitions/Day\"}"
196−toSchemaRef :: ToSchema a => proxy a -> Referenced Schema
200+toSchemaRef :: ToSchema a => Proxy a -> Referenced Schema
197toSchemaRef = undeclare . declareSchemaRef
201toSchemaRef = undeclare . declareSchemaRef
199-- | Convert a type into a referenced schema if possible
203-- | Convert a type into a referenced schema if possible
@@ -203,7 +207,7 @@ toSchemaRef = undeclare . declareSchemaRef
203-- Schema definitions are typically declared for every referenced schema.
207-- Schema definitions are typically declared for every referenced schema.
204-- If @'declareSchemaRef'@ returns a reference, a corresponding schema
208-- If @'declareSchemaRef'@ returns a reference, a corresponding schema
205-- will be declared (regardless of whether it is recusive or not).
209-- will be declared (regardless of whether it is recusive or not).
206−declareSchemaRef :: ToSchema a => proxy a -> Declare (Definitions Schema) (Referenced Schema)
210+declareSchemaRef :: ToSchema a => Proxy a -> Declare (Definitions Schema) (Referenced Schema)
207declareSchemaRef proxy = do
211declareSchemaRef proxy = do
208 case toNamedSchema proxy of
212 case toNamedSchema proxy of
209 NamedSchema (Just name) schema -> do
213 NamedSchema (Just name) schema -> do
@@ -265,7 +269,7 @@ inlineAllSchemas = inlineSchemasWhen (const True)
266-- __WARNING:__ @'toInlinedSchema'@ will produce infinite schema
270-- __WARNING:__ @'toInlinedSchema'@ will produce infinite schema
267-- when inlining recursive schemas.
271-- when inlining recursive schemas.
268−toInlinedSchema :: ToSchema a => proxy a -> Schema
272+toInlinedSchema :: ToSchema a => Proxy a -> Schema
269toInlinedSchema proxy = inlineAllSchemas defs schema
273toInlinedSchema proxy = inlineAllSchemas defs schema
271 (defs, schema) = runDeclare (declareSchema proxy) mempty
275 (defs, schema) = runDeclare (declareSchema proxy) mempty
@@ -294,20 +298,20 @@ inlineNonRecursiveSchemas defs = inlineSchemasWhen nonRecursive defs
294-- | Default schema for binary data (any sequence of octets).
298-- | Default schema for binary data (any sequence of octets).
295binarySchema :: Schema
299binarySchema :: Schema
296binarySchema = mempty
300binarySchema = mempty
297− & type_ .~ SwaggerString
301+ & type_ ?~ SwaggerString
298 & format ?~ "binary"
302 & format ?~ "binary"
300-- | Default schema for binary data (base64 encoded).
304-- | Default schema for binary data (base64 encoded).
301byteSchema :: Schema
305byteSchema :: Schema
302byteSchema = mempty
306byteSchema = mempty
303− & type_ .~ SwaggerString
307+ & type_ ?~ SwaggerString
304 & format ?~ "byte"
308 & format ?~ "byte"
306-- | Default schema for password string.
310-- | Default schema for password string.
307-- @"password"@ format is used to hint UIs the input needs to be obscured.
311-- @"password"@ format is used to hint UIs the input needs to be obscured.
308passwordSchema :: Schema
312passwordSchema :: Schema
309passwordSchema = mempty
313passwordSchema = mempty
310− & type_ .~ SwaggerString
314+ & type_ ?~ SwaggerString
311 & format ?~ "password"
315 & format ?~ "password"
313-- | Make an unrestrictive sketch of a @'Schema'@ based on a @'ToJSON'@ instance.
317-- | Make an unrestrictive sketch of a @'Schema'@ based on a @'ToJSON'@ instance.
@@ -333,12 +337,12 @@ sketchSchema = sketch . toJSON
333 sketch js@(Bool _) = go js
337 sketch js@(Bool _) = go js
334 sketch js = go js & example ?~ js
338 sketch js = go js & example ?~ js
336− go Null = mempty & type_ .~ SwaggerNull
340+ go Null = mempty & type_ ?~ SwaggerNull
337− go (Bool _) = mempty & type_ .~ SwaggerBoolean
341+ go (Bool _) = mempty & type_ ?~ SwaggerBoolean
338− go (String _) = mempty & type_ .~ SwaggerString
342+ go (String _) = mempty & type_ ?~ SwaggerString
339− go (Number _) = mempty & type_ .~ SwaggerNumber
343+ go (Number _) = mempty & type_ ?~ SwaggerNumber
340 go (Array xs) = mempty
344 go (Array xs) = mempty
341− & type_ .~ SwaggerArray
345+ & type_ ?~ SwaggerArray
342 & items ?~ case ischema of
346 & items ?~ case ischema of
343 Just s -> SwaggerItemsObject (Inline s)
347 Just s -> SwaggerItemsObject (Inline s)
344 _ -> SwaggerItemsArray (map Inline ys)
348 _ -> SwaggerItemsArray (map Inline ys)
@@ -350,7 +354,7 @@ sketchSchema = sketch . toJSON
350 (z:_) | allSame -> Just z
354 (z:_) | allSame -> Just z
351 _ -> Nothing
355 _ -> Nothing
352 go (Object o) = mempty
356 go (Object o) = mempty
353− & type_ .~ SwaggerObject
357+ & type_ ?~ SwaggerObject
354 & required .~ HashMap.keys o
358 & required .~ HashMap.keys o
355 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
359 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
@@ -373,24 +377,24 @@ sketchSchema = sketch . toJSON
373sketchStrictSchema :: ToJSON a => a -> Schema
377sketchStrictSchema :: ToJSON a => a -> Schema
374sketchStrictSchema = go . toJSON
378sketchStrictSchema = go . toJSON
376− go Null = mempty & type_ .~ SwaggerNull
380+ go Null = mempty & type_ ?~ SwaggerNull
377 go js@(Bool _) = mempty
381 go js@(Bool _) = mempty
378− & type_ .~ SwaggerBoolean
382+ & type_ ?~ SwaggerBoolean
379 & enum_ ?~ [js]
383 & enum_ ?~ [js]
380 go js@(String s) = mempty
384 go js@(String s) = mempty
381− & type_ .~ SwaggerString
385+ & type_ ?~ SwaggerString
382 & maxLength ?~ fromIntegral (T.length s)
386 & maxLength ?~ fromIntegral (T.length s)
383 & minLength ?~ fromIntegral (T.length s)
387 & minLength ?~ fromIntegral (T.length s)
384 & pattern ?~ s
388 & pattern ?~ s
385 & enum_ ?~ [js]
389 & enum_ ?~ [js]
386 go js@(Number n) = mempty
390 go js@(Number n) = mempty
387− & type_ .~ SwaggerNumber
391+ & type_ ?~ SwaggerNumber
388 & maximum_ ?~ n
392 & maximum_ ?~ n
389 & minimum_ ?~ n
393 & minimum_ ?~ n
390 & multipleOf ?~ n
394 & multipleOf ?~ n
391 & enum_ ?~ [js]
395 & enum_ ?~ [js]
392 go js@(Array xs) = mempty
396 go js@(Array xs) = mempty
393− & type_ .~ SwaggerArray
397+ & type_ ?~ SwaggerArray
394 & maxItems ?~ fromIntegral sz
398 & maxItems ?~ fromIntegral sz
395 & minItems ?~ fromIntegral sz
399 & minItems ?~ fromIntegral sz
396 & items ?~ SwaggerItemsArray (map (Inline . go) (V.toList xs))
400 & items ?~ SwaggerItemsArray (map (Inline . go) (V.toList xs))
@@ -400,7 +404,7 @@ sketchStrictSchema = go . toJSON
400 sz = length xs
404 sz = length xs
401 allUnique = sz == HashSet.size (HashSet.fromList (V.toList xs))
405 allUnique = sz == HashSet.size (HashSet.fromList (V.toList xs))
402 go js@(Object o) = mempty
406 go js@(Object o) = mempty
403− & type_ .~ SwaggerObject
407+ & type_ ?~ SwaggerObject
404 & required .~ names
408 & required .~ names
405 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
409 & properties .~ fmap (Inline . go) (InsOrdHashMap.fromHashMap o)
406 & maxProperties ?~ fromIntegral (length names)
410 & maxProperties ?~ fromIntegral (length names)
@@ -410,13 +414,13 @@ sketchStrictSchema = go . toJSON
410 names = HashMap.keys o
414 names = HashMap.keys o
412class GToSchema (f :: * -> *) where
416class GToSchema (f :: * -> *) where
413− gdeclareNamedSchema :: SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
417+ gdeclareNamedSchema :: SchemaOptions -> Proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
415instance OVERLAPPABLE_ ToSchema a => ToSchema [a] where
419instance OVERLAPPABLE_ ToSchema a => ToSchema [a] where
416 declareNamedSchema _ = do
420 declareNamedSchema _ = do
417 ref <- declareSchemaRef (Proxy :: Proxy a)
421 ref <- declareSchemaRef (Proxy :: Proxy a)
418 return $ unnamed $ mempty
422 return $ unnamed $ mempty
419− & type_ .~ SwaggerArray
423+ & type_ ?~ SwaggerArray
420 & items ?~ SwaggerItemsObject ref
424 & items ?~ SwaggerItemsObject ref
422instance OVERLAPPING_ ToSchema String where declareNamedSchema = plain . paramSchemaToSchema
426instance OVERLAPPING_ ToSchema String where declareNamedSchema = plain . paramSchemaToSchema
@@ -466,7 +470,7 @@ instance (ToSchema a, ToSchema b, ToSchema c, ToSchema d, ToSchema e, ToSchema f
467timeSchema :: T.Text -> Schema
471timeSchema :: T.Text -> Schema
468timeSchema fmt = mempty
472timeSchema fmt = mempty
469− & type_ .~ SwaggerString
473+ & type_ ?~ SwaggerString
470 & format ?~ fmt
474 & format ?~ fmt
472-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format.
476-- | Format @"date"@ corresponds to @yyyy-mm-dd@ format.
@@ -528,8 +532,8 @@ instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (Map k v) where
528 declareObjectMapSchema = do
532 declareObjectMapSchema = do
529 schema <- declareSchemaRef (Proxy :: Proxy v)
533 schema <- declareSchemaRef (Proxy :: Proxy v)
530 return $ unnamed $ mempty
534 return $ unnamed $ mempty
531− & type_ .~ SwaggerObject
535+ & type_ ?~ SwaggerObject
532− & additionalProperties ?~ schema
536+ & additionalProperties ?~ AdditionalPropertiesSchema schema
534instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (HashMap k v) where
538instance (ToJSONKey k, ToSchema k, ToSchema v) => ToSchema (HashMap k v) where
535 declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map k v))
539 declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map k v))
@@ -540,7 +544,7 @@ instance ToSchema a => ToSchema (Map String a) where
540 declareNamedSchema _ = do
544 declareNamedSchema _ = do
541 schema <- declareSchemaRef (Proxy :: Proxy a)
545 schema <- declareSchemaRef (Proxy :: Proxy a)
542 return $ unnamed $ mempty
546 return $ unnamed $ mempty
543− & type_ .~ SwaggerObject
547+ & type_ ?~ SwaggerObject
544 & additionalProperties ?~ schema
548 & additionalProperties ?~ schema
546instance ToSchema a => ToSchema (Map T.Text a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map String a))
550instance ToSchema a => ToSchema (Map T.Text a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy (Map String a))
@@ -552,6 +556,12 @@ 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
555instance ToSchema a => ToSchema (V.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
565instance ToSchema a => ToSchema (V.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
556instance ToSchema a => ToSchema (VU.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
566instance ToSchema a => ToSchema (VU.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
557instance ToSchema a => ToSchema (VS.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
567instance ToSchema a => ToSchema (VS.Vector a) where declareNamedSchema _ = declareNamedSchema (Proxy :: Proxy [a])
@@ -587,26 +597,26 @@ instance ToSchema a => ToSchema (Identity a) where declareNamedSchema _ = declar
588-- >>> encode $ toSchemaBoundedIntegral (Proxy :: Proxy Int16)
598-- >>> encode $ toSchemaBoundedIntegral (Proxy :: Proxy Int16)
589-- "{\"maximum\":32767,\"minimum\":-32768,\"type\":\"integer\"}"
599-- "{\"maximum\":32767,\"minimum\":-32768,\"type\":\"integer\"}"
590−toSchemaBoundedIntegral :: forall a proxy. (Bounded a, Integral a) => proxy a -> Schema
600+toSchemaBoundedIntegral :: forall a. (Bounded a, Integral a) => Proxy a -> Schema
591toSchemaBoundedIntegral _ = mempty
601toSchemaBoundedIntegral _ = mempty
592− & type_ .~ SwaggerInteger
602+ & type_ ?~ SwaggerInteger
593 & minimum_ ?~ fromInteger (toInteger (minBound :: a))
603 & minimum_ ?~ fromInteger (toInteger (minBound :: a))
594 & maximum_ ?~ fromInteger (toInteger (maxBound :: a))
604 & maximum_ ?~ fromInteger (toInteger (maxBound :: a))
596-- | Default generic named schema for @'Bounded'@, @'Integral'@ types.
606-- | Default generic named schema for @'Bounded'@, @'Integral'@ types.
597−genericToNamedSchemaBoundedIntegral :: forall a d f proxy.
607+genericToNamedSchemaBoundedIntegral :: forall a d f.
598 ( Bounded a, Integral a
608 ( Bounded a, Integral a
599 , Generic a, Rep a ~ D1 d f, Datatype d)
609 , Generic a, Rep a ~ D1 d f, Datatype d)
600− => SchemaOptions -> proxy a -> NamedSchema
610+ => SchemaOptions -> Proxy a -> NamedSchema
601genericToNamedSchemaBoundedIntegral opts proxy
611genericToNamedSchemaBoundedIntegral opts proxy
602 = genericNameSchema opts proxy (toSchemaBoundedIntegral proxy)
612 = genericNameSchema opts proxy (toSchemaBoundedIntegral proxy)
604-- | Declare a named schema for a @newtype@ wrapper.
614-- | Declare a named schema for a @newtype@ wrapper.
605−genericDeclareNamedSchemaNewtype :: forall proxy a d c s i inner.
615+genericDeclareNamedSchemaNewtype :: forall a d c s i inner.
606 (Generic a, Datatype d, Rep a ~ D1 d (C1 c (S1 s (K1 i inner))))
616 (Generic a, Datatype d, Rep a ~ D1 d (C1 c (S1 s (K1 i inner))))
607 => SchemaOptions -- ^ How to derive the name.
617 => SchemaOptions -- ^ How to derive the name.
608 -> (Proxy inner -> Declare (Definitions Schema) Schema) -- ^ How to create a schema for the wrapped type.
618 -> (Proxy inner -> Declare (Definitions Schema) Schema) -- ^ How to create a schema for the wrapped type.
609− -> proxy a
619+ -> Proxy a
610 -> Declare (Definitions Schema) NamedSchema
620 -> Declare (Definitions Schema) NamedSchema
611genericDeclareNamedSchemaNewtype opts f proxy = genericNameSchema opts proxy <$> f (Proxy :: Proxy inner)
621genericDeclareNamedSchemaNewtype opts f proxy = genericNameSchema opts proxy <$> f (Proxy :: Proxy inner)
@@ -623,9 +633,9 @@ genericDeclareNamedSchemaNewtype opts f proxy = genericNameSchema opts proxy <$>
624-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
634-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
625-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
635-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
626−declareSchemaBoundedEnumKeyMapping :: forall map key value proxy.
636+declareSchemaBoundedEnumKeyMapping :: forall map key value.
627 (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
637 (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
628− => proxy (map key value) -> Declare (Definitions Schema) Schema
638+ => Proxy (map key value) -> Declare (Definitions Schema) Schema
629declareSchemaBoundedEnumKeyMapping _ = case toJSONKey :: ToJSONKeyFunction key of
639declareSchemaBoundedEnumKeyMapping _ = case toJSONKey :: ToJSONKeyFunction key of
630 ToJSONKeyText keyToText _ -> objectSchema keyToText
640 ToJSONKeyText keyToText _ -> objectSchema keyToText
631 ToJSONKeyValue _ _ -> declareSchema (Proxy :: Proxy [(key, value)])
641 ToJSONKeyValue _ _ -> declareSchema (Proxy :: Proxy [(key, value)])
@@ -635,7 +645,7 @@ declareSchemaBoundedEnumKeyMapping _ = case toJSONKey :: ToJSONKeyFunction key o
635 let allKeys = [minBound..maxBound :: key]
645 let allKeys = [minBound..maxBound :: key]
636 mkPair k = (keyToText k, valueRef)
646 mkPair k = (keyToText k, valueRef)
637 return $ mempty
647 return $ mempty
638− & type_ .~ SwaggerObject
648+ & type_ ?~ SwaggerObject
639 & properties .~ InsOrdHashMap.fromList (map mkPair allKeys)
649 & properties .~ InsOrdHashMap.fromList (map mkPair allKeys)
641-- | A 'Schema' for a mapping with 'Bounded' 'Enum' keys.
651-- | A 'Schema' for a mapping with 'Bounded' 'Enum' keys.
@@ -651,46 +661,46 @@ declareSchemaBoundedEnumKeyMapping _ = case toJSONKey :: ToJSONKeyFunction key o
652-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
662-- Note: this is only useful when @key@ is encoded with 'ToJSONKeyText'.
653-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
663-- If it is encoded with 'ToJSONKeyValue' then a regular schema for @[(key, value)]@ is used.
654−toSchemaBoundedEnumKeyMapping :: forall map key value proxy.
664+toSchemaBoundedEnumKeyMapping :: forall map key value.
655 (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
665 (Bounded key, Enum key, ToJSONKey key, ToSchema key, ToSchema value)
656− => proxy (map key value) -> Schema
666+ => Proxy (map key value) -> Schema
657toSchemaBoundedEnumKeyMapping = flip evalDeclare mempty . declareSchemaBoundedEnumKeyMapping
667toSchemaBoundedEnumKeyMapping = flip evalDeclare mempty . declareSchemaBoundedEnumKeyMapping
659-- | A configurable generic @'Schema'@ creator.
669-- | A configurable generic @'Schema'@ creator.
660genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
670genericDeclareSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareSchemaUnrestricted") =>
661− SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
671+ SchemaOptions -> Proxy a -> Declare (Definitions Schema) Schema
662genericDeclareSchema = genericDeclareSchemaUnrestricted
672genericDeclareSchema = genericDeclareSchemaUnrestricted
664-- | A configurable generic @'NamedSchema'@ creator.
674-- | A configurable generic @'NamedSchema'@ creator.
665-- This function applied to @'defaultSchemaOptions'@
675-- This function applied to @'defaultSchemaOptions'@
666-- is used as the default for @'declareNamedSchema'@
676-- is used as the default for @'declareNamedSchema'@
667-- when the type is an instance of @'Generic'@.
677-- when the type is an instance of @'Generic'@.
668−genericDeclareNamedSchema :: forall a proxy. (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
678+genericDeclareNamedSchema :: (Generic a, GToSchema (Rep a), TypeHasSimpleShape a "genericDeclareNamedSchemaUnrestricted") =>
669− SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
679+ SchemaOptions -> Proxy a -> Declare (Definitions Schema) NamedSchema
670genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
680genericDeclareNamedSchema = genericDeclareNamedSchemaUnrestricted
672-- | A configurable generic @'Schema'@ creator.
682-- | A configurable generic @'Schema'@ creator.
674-- Unlike 'genericDeclareSchema' also works for mixed sum types.
684-- Unlike 'genericDeclareSchema' also works for mixed sum types.
675-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
685-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
676−genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> proxy a -> Declare (Definitions Schema) Schema
686+genericDeclareSchemaUnrestricted :: (Generic a, GToSchema (Rep a)) => SchemaOptions -> Proxy a -> Declare (Definitions Schema) Schema
677genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
687genericDeclareSchemaUnrestricted opts proxy = _namedSchemaSchema <$> genericDeclareNamedSchemaUnrestricted opts proxy
679-- | A configurable generic @'NamedSchema'@ creator.
689-- | A configurable generic @'NamedSchema'@ creator.
681-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
691-- Unlike 'genericDeclareNamedSchema' also works for mixed sum types.
682-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
692-- Use with care since some Swagger tools do not support well schemas for mixed sum types.
683−genericDeclareNamedSchemaUnrestricted :: forall a proxy. (Generic a, GToSchema (Rep a)) =>
693+genericDeclareNamedSchemaUnrestricted :: forall a. (Generic a, GToSchema (Rep a)) =>
684− SchemaOptions -> proxy a -> Declare (Definitions Schema) NamedSchema
694+ SchemaOptions -> Proxy a -> Declare (Definitions Schema) NamedSchema
685genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
695genericDeclareNamedSchemaUnrestricted opts _ = gdeclareNamedSchema opts (Proxy :: Proxy (Rep a)) mempty
687-- | Derive a 'Generic'-based name for a datatype and assign it to a given 'Schema'.
697-- | Derive a 'Generic'-based name for a datatype and assign it to a given 'Schema'.
688−genericNameSchema :: forall a d f proxy.
698+genericNameSchema :: forall a d f.
689 (Generic a, Rep a ~ D1 d f, Datatype d)
699 (Generic a, Rep a ~ D1 d f, Datatype d)
690− => SchemaOptions -> proxy a -> Schema -> NamedSchema
700+ => SchemaOptions -> Proxy a -> Schema -> NamedSchema
691genericNameSchema opts _ = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d))
701genericNameSchema opts _ = NamedSchema (gdatatypeSchemaName opts (Proxy :: Proxy d))
693−gdatatypeSchemaName :: forall proxy d. Datatype d => SchemaOptions -> proxy d -> Maybe T.Text
703+gdatatypeSchemaName :: forall d. Datatype d => SchemaOptions -> Proxy d -> Maybe T.Text
694gdatatypeSchemaName opts _ = case orig of
704gdatatypeSchemaName opts _ = case orig of
695 (c:_) | isAlpha c && isUpper c -> Just (T.pack name)
705 (c:_) | isAlpha c && isUpper c -> Just (T.pack name)
696 _ -> Nothing
706 _ -> Nothing
@@ -699,24 +709,23 @@ gdatatypeSchemaName opts _ = case orig of
699 name = datatypeNameModifier opts orig
709 name = datatypeNameModifier opts orig
701-- | Lift a plain @'ParamSchema'@ into a model @'NamedSchema'@.
711-- | Lift a plain @'ParamSchema'@ into a model @'NamedSchema'@.
702−paramSchemaToNamedSchema :: forall a d f proxy.
703− (ToParamSchema a, Generic a, Rep a ~ D1 d f, Datatype d)
712+paramSchemaToNamedSchema :: (ToParamSchema a, Generic a, Rep a ~ D1 d f, Datatype d) =>
704− => SchemaOptions -> proxy a -> NamedSchema
713+ SchemaOptions -> Proxy a -> NamedSchema
705paramSchemaToNamedSchema opts proxy = genericNameSchema opts proxy (paramSchemaToSchema proxy)
714paramSchemaToNamedSchema opts proxy = genericNameSchema opts proxy (paramSchemaToSchema proxy)
707-- | Lift a plain @'ParamSchema'@ into a model @'Schema'@.
716-- | Lift a plain @'ParamSchema'@ into a model @'Schema'@.
708−paramSchemaToSchema :: forall a proxy. ToParamSchema a => proxy a -> Schema
717+paramSchemaToSchema :: ToParamSchema a => Proxy a -> Schema
709−paramSchemaToSchema _ = mempty & paramSchema .~ toParamSchema (Proxy :: Proxy a)
718+paramSchemaToSchema proxy = mempty & paramSchema .~ toParamSchema proxy
711nullarySchema :: Schema
720nullarySchema :: Schema
712nullarySchema = mempty
721nullarySchema = mempty
713− & type_ .~ SwaggerArray
722+ & type_ ?~ SwaggerArray
714 & items ?~ SwaggerItemsArray []
723 & items ?~ SwaggerItemsArray []
716−gtoNamedSchema :: GToSchema f => SchemaOptions -> proxy f -> NamedSchema
725+gtoNamedSchema :: GToSchema f => SchemaOptions -> Proxy f -> NamedSchema
717gtoNamedSchema opts proxy = undeclare $ gdeclareNamedSchema opts proxy mempty
726gtoNamedSchema opts proxy = undeclare $ gdeclareNamedSchema opts proxy mempty
719−gdeclareSchema :: GToSchema f => SchemaOptions -> proxy f -> Declare (Definitions Schema) Schema
728+gdeclareSchema :: GToSchema f => SchemaOptions -> Proxy f -> Declare (Definitions Schema) Schema
720gdeclareSchema opts proxy = _namedSchemaSchema <$> gdeclareNamedSchema opts proxy mempty
729gdeclareSchema opts proxy = _namedSchemaSchema <$> gdeclareNamedSchema opts proxy mempty
722instance (GToSchema f, GToSchema g) => GToSchema (f :*: g) where
731instance (GToSchema f, GToSchema g) => GToSchema (f :*: g) where
@@ -750,7 +759,7 @@ instance (Selector s, GToSchema f, GToSchema (S1 s f)) => GToSchema (C1 c (S1 s
750 recordSchema = gdeclareNamedSchema opts (Proxy :: Proxy (S1 s f)) s
759 recordSchema = gdeclareNamedSchema opts (Proxy :: Proxy (S1 s f)) s
751 fieldSchema = gdeclareNamedSchema opts (Proxy :: Proxy f) s
760 fieldSchema = gdeclareNamedSchema opts (Proxy :: Proxy f) s
753−gdeclareSchemaRef :: GToSchema a => SchemaOptions -> proxy a -> Declare (Definitions Schema) (Referenced Schema)
762+gdeclareSchemaRef :: GToSchema a => SchemaOptions -> Proxy a -> Declare (Definitions Schema) (Referenced Schema)
754gdeclareSchemaRef opts proxy = do
763gdeclareSchemaRef opts proxy = do
755 case gtoNamedSchema opts proxy of
764 case gtoNamedSchema opts proxy of
756 NamedSchema (Just name) schema -> do
765 NamedSchema (Just name) schema -> do
@@ -781,12 +790,12 @@ withFieldSchema opts _ isRequiredField schema = do
782 if T.null fname
791 if T.null fname
783 then schema
792 then schema
784− & type_ .~ SwaggerArray
793+ & type_ ?~ SwaggerArray
785 & items %~ appendItem ref
794 & items %~ appendItem ref
786 & maxItems %~ Just . maybe 1 (+1) -- increment maxItems
795 & maxItems %~ Just . maybe 1 (+1) -- increment maxItems
787 & minItems %~ Just . maybe 1 (+1) -- increment minItems
796 & minItems %~ Just . maybe 1 (+1) -- increment minItems
788 else schema
797 else schema
789− & type_ .~ SwaggerObject
798+ & type_ ?~ SwaggerObject
790 & properties . at fname ?~ ref
799 & properties . at fname ?~ ref
791 & if isRequiredField
800 & if isRequiredField
792 then required %~ (++ [fname])
801 then required %~ (++ [fname])
@@ -814,7 +823,7 @@ instance ( GSumToSchema f
815 gdeclareNamedSchema = gdeclareNamedSumSchema
824 gdeclareNamedSchema = gdeclareNamedSumSchema
817−gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
826+gdeclareNamedSumSchema :: GSumToSchema f => SchemaOptions -> Proxy f -> Schema -> Declare (Definitions Schema) NamedSchema
818gdeclareNamedSumSchema opts proxy s
827gdeclareNamedSumSchema opts proxy s
819 | allNullaryToStringTag opts && allNullary = pure $ unnamed (toStringTag sumSchema)
828 | allNullaryToStringTag opts && allNullary = pure $ unnamed (toStringTag sumSchema)
820 | otherwise = (unnamed . fst) <$> runWriterT declareSumSchema
829 | otherwise = (unnamed . fst) <$> runWriterT declareSumSchema
@@ -823,29 +832,29 @@ gdeclareNamedSumSchema opts proxy s
823 (sumSchema, All allNullary) = undeclare (runWriterT declareSumSchema)
832 (sumSchema, All allNullary) = undeclare (runWriterT declareSumSchema)
825 toStringTag schema = mempty
834 toStringTag schema = mempty
826− & type_ .~ SwaggerString
835+ & type_ ?~ SwaggerString
827 & enum_ ?~ map toJSON (schema ^.. properties.ifolded.asIndex)
836 & enum_ ?~ map toJSON (schema ^.. properties.ifolded.asIndex)
829type AllNullary = All
838type AllNullary = All
831class GSumToSchema (f :: * -> *) where
840class GSumToSchema (f :: * -> *) where
832− gsumToSchema :: SchemaOptions -> proxy f -> Schema -> WriterT AllNullary (Declare (Definitions Schema)) Schema
841+ gsumToSchema :: SchemaOptions -> Proxy f -> Schema -> WriterT AllNullary (Declare (Definitions Schema)) Schema
834instance (GSumToSchema f, GSumToSchema g) => GSumToSchema (f :+: g) where
843instance (GSumToSchema f, GSumToSchema g) => GSumToSchema (f :+: g) where
835 gsumToSchema opts _ = gsumToSchema opts (Proxy :: Proxy f) >=> gsumToSchema opts (Proxy :: Proxy g)
844 gsumToSchema opts _ = gsumToSchema opts (Proxy :: Proxy f) >=> gsumToSchema opts (Proxy :: Proxy g)
837−gsumConToSchemaWith :: forall c f proxy. (GToSchema (C1 c f), Constructor c) =>
846+gsumConToSchemaWith :: forall c f. (GToSchema (C1 c f), Constructor c) =>
838− Referenced Schema -> SchemaOptions -> proxy (C1 c f) -> Schema -> Schema
847+ Referenced Schema -> SchemaOptions -> Proxy (C1 c f) -> Schema -> Schema
839gsumConToSchemaWith ref opts _ schema = schema
848gsumConToSchemaWith ref opts _ schema = schema
840− & type_ .~ SwaggerObject
849+ & type_ ?~ SwaggerObject
841 & properties . at tag ?~ ref
850 & properties . at tag ?~ ref
842 & maxProperties ?~ 1
851 & maxProperties ?~ 1
843 & minProperties ?~ 1
852 & minProperties ?~ 1
845 tag = T.pack (constructorTagModifier opts (conName (Proxy3 :: Proxy3 c f p)))
854 tag = T.pack (constructorTagModifier opts (conName (Proxy3 :: Proxy3 c f p)))
847−gsumConToSchema :: forall c f proxy. (GToSchema (C1 c f), Constructor c) =>
856+gsumConToSchema :: (GToSchema (C1 c f), Constructor c) =>
848− SchemaOptions -> proxy (C1 c f) -> Schema -> Declare (Definitions Schema) Schema
857+ SchemaOptions -> Proxy (C1 c f) -> Schema -> Declare (Definitions Schema) Schema
849gsumConToSchema opts proxy schema = do
858gsumConToSchema opts proxy schema = do
850 ref <- gdeclareSchemaRef opts proxy
859 ref <- gdeclareSchemaRef opts proxy
851 return $ gsumConToSchemaWith ref opts proxy schema
860 return $ gsumConToSchemaWith ref opts proxy schema