Skip to content

Commit

Permalink
Aeson 2 for extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbiehl committed May 28, 2024
1 parent 86511ac commit c2575df
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
6 changes: 6 additions & 0 deletions src/Data/OpenApi/Aeson/Compat.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ lookupKey = KeyMap.lookup . Key.fromText

hasKey :: T.Text -> KeyMap.KeyMap a -> Bool
hasKey = KeyMap.member . Key.fromText

filterKeys :: (Key -> Bool) -> KeyMap.KeyMap a -> KeyMap.KeyMap a
filterKeys p = KeyMap.filterWithKey (\key _ -> p key)
#else
filterWithKey :: (T.Text -> v -> Bool) -> HM.HashMap T.Text v -> HM.HashMap T.Text v
filterWithKey = HM.filterWithKey
Expand Down Expand Up @@ -79,4 +82,7 @@ lookupKey = HM.lookup

hasKey :: T.Text -> HM.HashMap T.Text a -> Bool
hasKey = HM.member

filterKeys :: (T.Text -> Bool) -> HM.HashMap T.Text a -> HM.HashMap T.Text a
filterKeys p = HM.filterWithKey (\key _ -> p key)
#endif
19 changes: 9 additions & 10 deletions src/Data/OpenApi/Internal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import Text.Read (readMaybe)
import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap

import Data.OpenApi.Aeson.Compat (deleteKey, filterWithKey, objectToList, keyToText)
import Data.OpenApi.Aeson.Compat (deleteKey, filterKeys, objectToList, keyToText)
import Data.OpenApi.Internal.AesonUtils (AesonDefaultValue (..), HasSwaggerAesonOptions (..),
mkSwaggerAesonOptions, saoAdditionalPairs, saoSubObject,
sopSwaggerGenericParseJSON, sopSwaggerGenericToEncoding,
Expand Down Expand Up @@ -1606,14 +1606,14 @@ instance FromJSON Responses where
<$> o .:? "default"
<*> parseJSON
( Object
( filterWithKey (\k _ -> not $ isExt k)
$ deleteKey "default" o
( filterKeys (not . isExt . keyToText) $
deleteKey "default" o
)
)
<*> case filterWithKey (\k _ -> isExt k) o of
exts
| null exts -> pure (SpecificationExtensions mempty)
| otherwise -> parseJSON (Object exts)
<*> case filterKeys (isExt . keyToText) o of
exts
| null exts -> pure (SpecificationExtensions mempty)
| otherwise -> parseJSON (Object exts)

parseJSON _ = empty

Expand Down Expand Up @@ -1689,7 +1689,7 @@ instance FromJSON SpecificationExtensions where
parseJSON = withObject "SpecificationExtensions" extFieldsParser
where
extFieldsParser = pure . SpecificationExtensions . InsOrdHashMap.fromList . catMaybes . filterExtFields
filterExtFields = fmap (\(k, v) -> fmap (\k' -> (k', v)) $ Text.stripPrefix "x-" (keyToText k)) . objectToList
filterExtFields = fmap (\(k, v) -> (, v) <$> Text.stripPrefix "x-" (keyToText k)) . objectToList

instance FromJSON Info where
parseJSON = sopSwaggerGenericParseJSONWithOpts (mkSwaggerAesonOptions "Info")
Expand Down Expand Up @@ -1743,8 +1743,7 @@ instance HasSwaggerAesonOptions Schema where
instance HasSwaggerAesonOptions OpenApiSpecVersion where
swaggerAesonOptions _ = mkSwaggerAesonOptions "openapi"
instance HasSwaggerAesonOptions OpenApi where
swaggerAesonOptions _ = mkSwaggerAesonOptions "swagger"
& saoSubObject .~ ["extensions"]
swaggerAesonOptions _ = mkSwaggerAesonOptions "swagger" & saoSubObject .~ ["extensions"]
instance HasSwaggerAesonOptions Example where
swaggerAesonOptions _ = mkSwaggerAesonOptions "example" & saoSubObject .~ ["extensions"]
instance HasSwaggerAesonOptions Encoding where
Expand Down

0 comments on commit c2575df

Please sign in to comment.