@@ -65,6 +65,9 @@ import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToEncoding)
65#define DEFINE_TOENCODING
65#define DEFINE_TOENCODING
69+-- >>> import Data.Aeson
68-- | A list of definitions that can be used in references.
71-- | A list of definitions that can be used in references.
69type Definitions = InsOrdHashMap Text
72type Definitions = InsOrdHashMap Text
@@ -1050,11 +1053,21 @@ instance ToJSON Header where
1050 toJSON = sopSwaggerGenericToJSON
1053 toJSON = sopSwaggerGenericToJSON
1051 DEFINE_TOENCODING
1054 DEFINE_TOENCODING
1056+-- | As for nullary schema for 0-arity type constructors, see
1057+-- <https://github.com/GetShopTV/swagger2/issues/167>.
1059+-- >>> encode (SwaggerItemsArray [])
1060+-- "{\"example\":[],\"items\":{},\"maxItems\":0}"
1053instance ToJSON (ParamSchema t) => ToJSON (SwaggerItems t) where
1062instance ToJSON (ParamSchema t) => ToJSON (SwaggerItems t) where
1054 toJSON (SwaggerItemsPrimitive fmt schema) = object
1063 toJSON (SwaggerItemsPrimitive fmt schema) = object
1055 [ "collectionFormat" .= fmt
1064 [ "collectionFormat" .= fmt
1056 , "items" .= schema ]
1065 , "items" .= schema ]
1057 toJSON (SwaggerItemsObject x) = object [ "items" .= x ]
1066 toJSON (SwaggerItemsObject x) = object [ "items" .= x ]
1067+ toJSON (SwaggerItemsArray []) = object
1068+ [ "items" .= object []
1069+ , "maxItems" .= (0 :: Int)
1070+ , "example" .= ([] :: [()]) ]
1058 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1071 toJSON (SwaggerItemsArray x) = object [ "items" .= x ]
1060instance ToJSON Host where
1073instance ToJSON Host where
@@ -1171,7 +1184,13 @@ instance FromJSON SecurityScheme where
1171 parseJSON = sopSwaggerGenericParseJSON
1184 parseJSON = sopSwaggerGenericParseJSON
1173instance FromJSON Schema where
1186instance FromJSON Schema where
1174− parseJSON = sopSwaggerGenericParseJSON
1187+ parseJSON = fmap nullaryCleanup . sopSwaggerGenericParseJSON
1188+ where nullaryCleanup :: Schema -> Schema
1189+ nullaryCleanup s@Schema{_schemaParamSchema=ps} =
1190+ if _paramSchemaItems ps == Just (SwaggerItemsArray [])
1191+ then s { _schemaExample = Nothing
1192+ , _schemaParamSchema = ps { _paramSchemaMaxItems = Nothing } }
1176instance FromJSON Header where
1195instance FromJSON Header where
1177 parseJSON = sopSwaggerGenericParseJSON
1196 parseJSON = sopSwaggerGenericParseJSON
@@ -1187,6 +1206,7 @@ instance FromJSON (SwaggerItems 'SwaggerKindParamOtherSchema) where
1187 <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1206 <*> ((o .: "items" >>= parseJSON) <|> fail ("foo" ++ show o))
1189instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1208instance FromJSON (SwaggerItems 'SwaggerKindSchema) where
1209+ parseJSON js | js == object [] = pure $ SwaggerItemsArray [] -- Nullary schema.
1190 parseJSON js@(Object _) = SwaggerItemsObject <$> parseJSON js
1210 parseJSON js@(Object _) = SwaggerItemsObject <$> parseJSON js
1191 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1211 parseJSON js@(Array _) = SwaggerItemsArray <$> parseJSON js
1192 parseJSON _ = empty
1212 parseJSON _ = empty