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