@@ -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_)
@@ -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,7 +532,7 @@ 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 ?~ AdditionalPropertiesSchema 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
@@ -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