@@ -12,12 +12,17 @@
1212{-# LANGUAGE ScopedTypeVariables #-}
1313{-# LANGUAGE StandaloneDeriving #-}
1414{-# LANGUAGE UndecidableInstances #-}
15+
16+{-# LANGUAGE DataKinds #-}
17+{-# LANGUAGE TypeFamilies #-}
18+{-# LANGUAGE TemplateHaskell #-}
1519#include "overlapping-compat.h"
1620module Data.Swagger.Internal where
1721
1822import Prelude ()
1923import Prelude.Compat
2024
25+import Control.Lens ((&), (.~), (?~))
2126import Control.Applicative
2227import Control.Monad
2328import Data.Aeson
@@ -41,6 +46,11 @@ import Text.Read (readMaybe)
4146import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
4247import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
4348
49+import Generics.SOP.TH (deriveGeneric)
50+import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToJSON
51+ ,mkSwaggerAesonOptions
52+ ,saoAdditionalPairs
53+ ,saoSubObject)
4454import Data.Swagger.Internal.Utils
4555
4656-- | A list of definitions that can be used in references.
@@ -921,7 +931,8 @@ instance ToJSON OAuth2Flow where
921931 , "tokenUrl" .= tokenUrl ]
922932
923933instance ToJSON OAuth2Params where
924− toJSON = omitEmpties . genericToJSONWithSub "flow" (jsonPrefix "oauth2")
934+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "oauth2" &
935+ saoSubObject ?~ "flow"
925936
926937instance ToJSON SecuritySchemeType where
927938 toJSON SecuritySchemeBasic
@@ -934,22 +945,20 @@ instance ToJSON SecuritySchemeType where
934945 <+> object [ "type" .= ("oauth2" :: Text) ]
935946
936947instance ToJSON Swagger where
937− toJSON = omitEmpties . addVersion . genericToJSON (jsonPrefix "swagger")
938− where
939− addVersion (Object o) = Object (HashMap.insert "swagger" "2.0" o)
940− addVersion _ = error "impossible"
948+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "swagger" &
949+ saoAdditionalPairs .~ [("swagger", "2.0")]
941950
942951instance ToJSON SecurityScheme where
943− toJSON = genericToJSONWithSub "type" (jsonPrefix "securityScheme")
952+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "securityScheme" &
953+ saoSubObject ?~ "type"
944954
945955instance ToJSON Schema where
946− toJSON = omitEmptiesExcept f . genericToJSONWithSub "paramSchema" (jsonPrefix "schema")
947− where
948− f "items" (Array _) = True
949− f _ _ = False
956+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "schema" &
957+ saoSubObject ?~ "paramSchema"
950958
951959instance ToJSON Header where
952− toJSON = genericToJSONWithSub "paramSchema" (jsonPrefix "header")
960+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "header" &
961+ saoSubObject ?~ "paramSchema"
953962
954963instance ToJSON (SwaggerItems t) where
955964 toJSON (SwaggerItemsPrimitive fmt schema) = object
@@ -968,26 +977,29 @@ instance ToJSON MimeList where
968977 toJSON (MimeList xs) = toJSON (map show xs)
969978
970979instance ToJSON Param where
971− toJSON = genericToJSONWithSub "schema" (jsonPrefix "param")
980+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "param" &
981+ saoSubObject ?~ "schema"
972982
973983instance ToJSON ParamAnySchema where
974984 toJSON (ParamBody s) = object [ "in" .= ("body" :: Text), "schema" .= s ]
975985 toJSON (ParamOther s) = toJSON s
976986
977987instance ToJSON ParamOtherSchema where
978− toJSON = genericToJSONWithSub "paramSchema" (jsonPrefix "paramOtherSchema")
988+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "paramOtherSchema" &
989+ saoSubObject ?~ "paramSchema"
979990
980991instance ToJSON Responses where
981− toJSON = omitEmpties . genericToJSONWithSub "responses" (jsonPrefix "responses")
992+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "responses" &
993+ saoSubObject ?~ "responses"
982994
983995instance ToJSON Response where
984− toJSON = omitEmpties . genericToJSON (jsonPrefix "response")
996+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "response"
985997
986998instance ToJSON Operation where
987− toJSON = omitEmpties . genericToJSON (jsonPrefix "operation")
999+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "operation"
9881000
9891001instance ToJSON PathItem where
990− toJSON = omitEmpties . genericToJSON (jsonPrefix "pathItem")
1002+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "pathItem"
9911003
9921004instance ToJSON Example where
9931005 toJSON = toJSON . Map.mapKeys show . getExample
@@ -1021,10 +1033,8 @@ instance ToJSON (CollectionFormat t) where
10211033 toJSON CollectionMulti = "multi"
10221034
10231035instance ToJSON (ParamSchema t) where
1024− toJSON = omitEmptiesExcept f . genericToJSONWithSub "items" (jsonPrefix "paramSchema")
1025− where
1026− f "items" (Array _) = True
1027− f _ _ = False
1036+ toJSON = sopSwaggerGenericToJSON $ mkSwaggerAesonOptions "paramSchema" &
1037+ saoSubObject ?~ "items"
10281038
10291039-- =======================================================================
10301040-- Manual FromJSON instances
@@ -1193,3 +1203,19 @@ instance FromJSON (CollectionFormat ParamOtherSchema) where
11931203instance (FromJSON (SwaggerType t), FromJSON (SwaggerItems t)) => FromJSON (ParamSchema t) where
11941204 parseJSON = genericParseJSONWithSub "items" (jsonPrefix "ParamSchema")
11951205
1206+-------------------------------------------------------------------------------
1207+-- TH splices
1208+-------------------------------------------------------------------------------
1209+
1210+deriveGeneric ''Header
1211+deriveGeneric ''OAuth2Params
1212+deriveGeneric ''Operation
1213+deriveGeneric ''Param
1214+deriveGeneric ''ParamOtherSchema
1215+deriveGeneric ''PathItem
1216+deriveGeneric ''Response
1217+deriveGeneric ''Responses
1218+deriveGeneric ''SecurityScheme
1219+deriveGeneric ''Schema
1220+deriveGeneric ''ParamSchema
1221+deriveGeneric ''Swagger