-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | json-spec-openapi -- -- This package provides a way to produce openapi3 documentation -- from a json-spec specification. -- --
-- data User = User
-- { name :: Text
-- , lastLogin :: UTCTime
-- }
-- deriving ToSchema via (EncodingSchema User) -- <-- ToSchema instance defined here
-- instance HasJsonEncodingSpec User where
-- type EncodingSpec User =
-- JsonObject
-- '[ '("name", JsonString)
-- , '("last-login", JsonDateTime)
-- ]
-- toJSONStructure user =
-- (Field @"name" (name user),
-- (Field @"last-login" (lastLogin user),
-- ()))
--
--
-- Calling `Data.Aeson.encode (Data.OpenApi3.toSchema (Proxy :: Proxy
-- User))` will produce the following Schema:
--
--
-- {
-- "additionalProperties": false,
-- "properties": {
-- "last-login": {
-- "format": "date-time",
-- "type": "string"
-- },
-- "name": {
-- "type": "string"
-- }
-- },
-- "required": [
-- "name",
-- "last-login"
-- ],
-- "type": "object"
-- }
--
@package json-spec-openapi
@version 0.1.0.2
-- | This module provides tools for integrating the type-level JSON
-- Specification with the "openapi" package.
--
-- You can use toOpenApiSchema as a low-level tool to transform
-- json-spec Specifications into openapi3
-- Schemas directly, irrespective of any particular business data
-- type.
--
-- More likely you will want to use -XDerivingVia along with
-- EncodingSchema or DecodingSchema to derive
-- ToSchema instances for your data types.
--
-- Example, given this data type:
--
--
-- data User = User
-- { name :: Text
-- , lastLogin :: UTCTime
-- }
-- deriving ToSchema via (EncodingSchema User) -- <-- ToSchema instance defined here
-- instance HasJsonEncodingSpec User where
-- type EncodingSpec User =
-- JsonObject
-- '[ '("name", JsonString)
-- , '("last-login", JsonDateTime)
-- ]
-- toJSONStructure user =
-- (Field @"name" (name user),
-- (Field @"last-login" (lastLogin user),
-- ()))
--
--
-- Calling encode (toSchema (Proxy ::
-- Proxy User)) will produce the following Schema:
--
--
-- {
-- "additionalProperties": false,
-- "properties": {
-- "last-login": {
-- "format": "date-time",
-- "type": "string"
-- },
-- "name": {
-- "type": "string"
-- }
-- },
-- "required": [
-- "name",
-- "last-login"
-- ],
-- "type": "object"
-- }
--
--
-- If you needed more control over the content of the schema you might
-- also consider doing something like this, e.g. in the case where you
-- would like to allow additional properties:
--
--
-- data User = User
-- { name :: Text
-- , lastLogin :: UTCTime
-- }
-- instance HasJsonEncodingSpec User where
-- type EncodingSpec User =
-- JsonObject
-- '[ '("name", JsonString)
-- , '("last-login", JsonDateTime)
-- ]
-- toJSONStructure user =
-- (Field @"name" (name user),
-- (Field @"last-login" (lastLogin user),
-- ()))
-- instance ToSchema User where
-- declareNamedSchema _proxy =
-- pure $
-- NamedSchema
-- Nothing
-- (
-- toOpenApiSchema (EncodingSpec User)
-- & set
-- additionalProperties
-- (Just (AdditionalPropertiesAllowed True))
-- )
--
module Data.JsonSpec.OpenApi
-- | Convert a Specification into an OpenAPI Schema. The type
-- class Internal is an internal and opaque implementation detail
-- and not something you should have to worry about. It should
-- already have an instance for every possible Specification that
-- can be constructed. If it does not, then that is a bug. Please report
-- it! :-)
toOpenApiSchema :: Internal spec => Proxy (spec :: Specification) -> Schema
-- | Helper for defining ToSchema instances based on
-- HasJsonEncodingSpec using deriving via.
--
-- Example:
--
-- -- data MyType = ... -- deriving ToSchema via (EncodingSchema MyType) -- instance HasJsonEncodingSchema MyType where -- ... --newtype EncodingSchema a EncodingSchema :: a -> EncodingSchema a [unEncodingSchema] :: EncodingSchema a -> a -- | Helper for defining ToSchema instances based on -- HasJsonDecodingSpec using deriving via. -- -- Example: -- --
-- data MyType = ... -- deriving ToSchema via (DecodingSchema MyType) -- instance HasJsonDecodingSchema MyType where -- ... --newtype DecodingSchema a DecodingSchema :: a -> DecodingSchema a [unDecodingSchema] :: DecodingSchema a -> a instance (Data.Typeable.Internal.Typeable a, Data.JsonSpec.OpenApi.Internal (Data.JsonSpec.Decode.DecodingSpec a)) => Data.OpenApi.Internal.Schema.ToSchema (Data.JsonSpec.OpenApi.DecodingSchema a) instance (Data.Typeable.Internal.Typeable a, Data.JsonSpec.OpenApi.Internal (Data.JsonSpec.Encode.EncodingSpec a)) => Data.OpenApi.Internal.Schema.ToSchema (Data.JsonSpec.OpenApi.EncodingSchema a) instance GHC.TypeLits.KnownSymbol tag => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonTag tag) instance Data.JsonSpec.OpenApi.Internal 'Data.JsonSpec.Spec.JsonString instance (Data.JsonSpec.OpenApi.Internal left, Data.JsonSpec.OpenApi.Internal right) => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonEither left right) instance Data.JsonSpec.OpenApi.Internal 'Data.JsonSpec.Spec.JsonNum instance Data.JsonSpec.OpenApi.Internal 'Data.JsonSpec.Spec.JsonInt instance Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonObject '[]) instance (GHC.TypeLits.KnownSymbol key, Data.JsonSpec.OpenApi.Internal spec, Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonObject more)) => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonObject ('(key, spec) : more)) instance Data.JsonSpec.OpenApi.Internal spec => Data.JsonSpec.OpenApi.Internal ('Data.JsonSpec.Spec.JsonArray spec) instance Data.JsonSpec.OpenApi.Internal 'Data.JsonSpec.Spec.JsonBool instance Data.JsonSpec.OpenApi.Internal 'Data.JsonSpec.Spec.JsonDateTime