git.iko.soy/typeable/openapi3
on master help sign in
Add inlineNonRecursiveSchemas helper
a4fc118Nickolay Kudasov
src/Data/Swagger/Internal/Schema.hs+22
@@ -21,6 +21,7 @@ import Control.Monad.Writer
21import Data.Aeson
21import Data.Aeson
22import Data.Char
22import Data.Char
23import Data.Data (Data)
23import Data.Data (Data)
24+import Data.Foldable (traverse_)
24import Data.HashMap.Strict (HashMap)
25import Data.HashMap.Strict (HashMap)
25import qualified Data.HashMap.Strict as HashMap
26import qualified Data.HashMap.Strict as HashMap
26import "unordered-containers" Data.HashSet (HashSet)
27import "unordered-containers" Data.HashSet (HashSet)
@@ -196,6 +197,27 @@ inlineSchemas names = inlineSchemasWhen (`elem` names)
196inlineAllSchemas :: Data s => Definitions -> s -> s
197inlineAllSchemas :: Data s => Definitions -> s -> s
197inlineAllSchemas = inlineSchemasWhen (const True)
198inlineAllSchemas = inlineSchemasWhen (const True)
198
199
200+-- | Inline all /non-recursive/ schemas for which the definition
201+-- can be found in @'Definitions'@.
202+inlineNonRecursiveSchemas :: Data s => Definitions -> s -> s
203+inlineNonRecursiveSchemas defs = inlineSchemasWhen nonRecursive defs
204+ where
205+ nonRecursive name =
206+ case HashMap.lookup name defs of
207+ Just schema -> name `notElem` execDeclare (usedNames schema) mempty
208+ Nothing -> False
209+
210+ usedNames schema = traverse_ schemaRefNames (schema ^.. template)
211+
212+ schemaRefNames :: Referenced Schema -> Declare [T.Text] ()
213+ schemaRefNames ref = case ref of
214+ Ref (Reference name) -> do
215+ seen <- looks (name `elem`)
216+ when (not seen) $ do
217+ declare [name]
218+ traverse_ usedNames (HashMap.lookup name defs)
219+ Inline subschema -> usedNames subschema
220+
199class GToSchema (f :: * -> *) where
221class GToSchema (f :: * -> *) where
200 gdeclareNamedSchema :: SchemaOptions -> proxy f -> Schema -> Declare Definitions NamedSchema
222 gdeclareNamedSchema :: SchemaOptions -> proxy f -> Schema -> Declare Definitions NamedSchema
201
223
src/Data/Swagger/Schema.hs+1
@@ -26,6 +26,7 @@ module Data.Swagger.Schema (
26 paramSchemaToSchema,
26 paramSchemaToSchema,
27
27
28 -- * Inlining @'Schema'@s
28 -- * Inlining @'Schema'@s
29+ inlineNonRecursiveSchemas,
29 inlineAllSchemas,
30 inlineAllSchemas,
30 inlineSchemas,
31 inlineSchemas,
31 inlineSchemasWhen,
32 inlineSchemasWhen,