openapi-hs-4.0.0: src/Data/OpenApi/SchemaOptions.hs
-- |
-- Module: Data.OpenApi.SchemaOptions
-- Maintainer: Nadeem Bitar <nadeem@gmail.com>
-- Stability: experimental
--
-- Generic deriving options for @ToParamSchema@ and @ToSchema@.
module Data.OpenApi.SchemaOptions where
import Data.Aeson.Types qualified as Aeson
-- | Options that specify how to encode your type to OpenAPI schema.
data SchemaOptions = SchemaOptions
{ -- | Function applied to field labels. Handy for removing common record prefixes for example.
fieldLabelModifier :: String -> String,
-- | Function applied to constructor tags which could be handy for lower-casing them for example.
constructorTagModifier :: String -> String,
-- | Function applied to datatype name.
datatypeNameModifier :: String -> String,
-- | If @'True'@ the constructors of a datatype, with all nullary constructors,
-- will be encoded to a string enumeration schema with the constructor tags as possible values.
allNullaryToStringTag :: Bool,
-- | Hide the field name when a record constructor has only one field, like a newtype.
unwrapUnaryRecords :: Bool,
-- | Specifies how to encode constructors of a sum datatype.
sumEncoding :: Aeson.SumEncoding
}
-- | Default encoding @'SchemaOptions'@.
--
-- @
-- 'SchemaOptions'
-- { 'fieldLabelModifier' = id
-- , 'constructorTagModifier' = id
-- , 'datatypeNameModifier' = id
-- , 'allNullaryToStringTag' = True
-- , 'unwrapUnaryRecords' = False
-- , 'sumEncoding' = 'Aeson.defaultTaggedObject'
-- }
-- @
defaultSchemaOptions :: SchemaOptions
defaultSchemaOptions =
SchemaOptions
{ fieldLabelModifier = id,
constructorTagModifier = id,
datatypeNameModifier = id,
allNullaryToStringTag = True,
unwrapUnaryRecords = False,
sumEncoding = Aeson.defaultTaggedObject
}
-- | Convert 'Aeson.Options' to 'SchemaOptions'.
--
-- Specifically the following fields get copied:
--
-- * 'fieldLabelModifier'
-- * 'constructorTagModifier'
-- * 'allNullaryToStringTag'
-- * 'unwrapUnaryRecords'
--
-- Note that these fields have no effect on `SchemaOptions`:
--
-- * 'Aeson.omitNothingFields'
-- * 'Aeson.tagSingleConstructors'
--
-- The rest is defined as in 'defaultSchemaOptions'.
--
-- @since 2.2.1
fromAesonOptions :: Aeson.Options -> SchemaOptions
fromAesonOptions opts =
defaultSchemaOptions
{ fieldLabelModifier = Aeson.fieldLabelModifier opts,
constructorTagModifier = Aeson.constructorTagModifier opts,
allNullaryToStringTag = Aeson.allNullaryToStringTag opts,
unwrapUnaryRecords = Aeson.unwrapUnaryRecords opts,
sumEncoding = Aeson.sumEncoding opts
}