git.iko.soy/deriving-openapi3
on master help sign in
.github/workflows/build.yaml+2−6
since splitsnapshots
unifiedsplit
@@ -17,7 +17,7 @@ jobs:
17 - name: Check library version
17 - name: Check library version
18 if: github.event_name == 'release'
18 if: github.event_name == 'release'
19 run: |
19 run: |
20− if [ "$(yq eval ".version" package.yaml)" != "${{ github.event.release.tag_name }}" ]; then
20+ if [ "$(awk -F":" '{if ($1 == "version") {gsub(/ /, "", $2); print $2}}' *.cabal)" != "${{ github.event.release.tag_name }}" ]; then
21 echo "::error file=action.yaml::Library version does not match release version."
21 echo "::error file=action.yaml::Library version does not match release version."
22 exit 1
22 exit 1
23 fi
23 fi
@@ -33,15 +33,11 @@ jobs:
33 path: |
33 path: |
34 ~/.stack
34 ~/.stack
35 .stack-work
35 .stack-work
36− key: ${{ runner.os }}-stack-${{ hashFiles('stack.yaml') }}-${{ hashFiles('package.yaml') }}
36+ key: ${{ runner.os }}-stack-${{ hashFiles('stack.yaml') }}-${{ hashFiles('**.cabal') }}
37 restore-keys: |
37 restore-keys: |
38 ${{ runner.os }}-stack-${{ hashFiles('stack.yaml') }}
38 ${{ runner.os }}-stack-${{ hashFiles('stack.yaml') }}
39 ${{ runner.os }}-stack
39 ${{ runner.os }}-stack
40
40
41− - name: Upgrade stack
42− shell: bash
43− run: stack upgrade --git
44−
45 - name: Build
41 - name: Build
46 shell: bash
42 shell: bash
47 run: |
43 run: |
deriving-openapi3.cabal+3−11
@@ -22,11 +22,6 @@ source-repository head
22 type: git
22 type: git
23 location: https://github.com/ilyakooo0/deriving-openapi3
23 location: https://github.com/ilyakooo0/deriving-openapi3
24
24
25−flag servant-description
26− description: Create instances for the 'Description' type from 'servant'
27− manual: False
28− default: True
29−
30library
25library
31 exposed-modules:
26 exposed-modules:
32 Deriving.OpenApi
27 Deriving.OpenApi
@@ -48,16 +43,13 @@ library
48 OverloadedStrings
43 OverloadedStrings
49 DerivingStrategies
44 DerivingStrategies
50 DerivingVia
45 DerivingVia
46+ FlexibleContexts
51 ghc-options: -Weverything -Wno-star-is-type -Wno-unsafe -Wno-prepositive-qualified-module -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-import-lists -Wno-implicit-prelude
47 ghc-options: -Weverything -Wno-star-is-type -Wno-unsafe -Wno-prepositive-qualified-module -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-import-lists -Wno-implicit-prelude
52 build-depends:
48 build-depends:
53 aeson
49 aeson
54− , base
50+ , base >=4.12
55− , deriving-aeson
51+ , deriving-aeson >=0.2.2
56 , lens
52 , lens
57 , openapi3
53 , openapi3
58 , text
54 , text
59− if flag(servant-description)
60− cpp-options: -DSERVANT_DESCRIPTION
61− build-depends:
62− servant
63 default-language: Haskell2010
55 default-language: Haskell2010
package.yamldeleted−51
@@ -1,51 +0,0 @@
1−name: deriving-openapi3
2−version: 0.1.0.0
3−synopsis: DerivingVia for OpenAPI 3
4−description: DerivingVia for OpenAPI 3
5−maintainer: Ilya Kostyuchenko <ilyakooo0@gmail.com>
6−category: JSON, Generics, OpenAPI
7−license: MIT
8−license-file: LICENSE
9−extra-source-files: Changelog.md
10−github: ilyakooo0/deriving-openapi3
11−ghc-options: -Weverything
12− -Wno-star-is-type
13− -Wno-unsafe
14− -Wno-prepositive-qualified-module
15− -Wno-safe
16− -Wno-missing-safe-haskell-mode
17− -Wno-missing-import-lists
18− -Wno-implicit-prelude
19−dependencies:
20− - base
21− - openapi3
22− - deriving-aeson
23− - aeson
24− - lens
25− - text
26−when:
27− - condition: flag(servant-description)
28− dependencies:
29− - servant
30− cpp-options: -DSERVANT_DESCRIPTION
31−library:
32− source-dirs: src
33−default-extensions:
34− - AllowAmbiguousTypes
35− - ScopedTypeVariables
36− - KindSignatures
37− - DataKinds
38− - TypeOperators
39− - FlexibleInstances
40− - TypeApplications
41− - UndecidableInstances
42− - TypeFamilies
43− - PolyKinds
44− - OverloadedStrings
45− - DerivingStrategies
46− - DerivingVia
47−flags:
48− servant-description:
49− description: Create instances for the 'Description' type from 'servant'
50− default: true
51− manual: false
src/Deriving/OpenApi.hs+13−8
@@ -39,19 +39,17 @@ where
39import Control.Lens
39import Control.Lens
40import qualified Data.Aeson.Types as A
40import qualified Data.Aeson.Types as A
41import Data.OpenApi
41import Data.OpenApi
42+import Data.OpenApi.Internal.ParamSchema
42import Data.OpenApi.Internal.Schema
43import Data.OpenApi.Internal.Schema
43import Data.Proxy
44import Data.Proxy
45+import Data.Text (Text)
46+import qualified Data.Text as T
44import Data.Typeable
47import Data.Typeable
45import Deriving.Aeson
48import Deriving.Aeson
46import GHC.Generics
49import GHC.Generics
47import GHC.TypeLits
50import GHC.TypeLits
48
51
49−
52+data Description (desc :: Symbol) = Description
50−#ifdef SERVANT_DESCRIPTION
51−
52−import Servant.API
53−import Data.Text (Text)
54−import qualified Data.Text as T
55
53
56instance (AesonOptions xs) => AesonOptions (Description f ': xs) where
54instance (AesonOptions xs) => AesonOptions (Description f ': xs) where
57 aesonOptions = aesonOptions @xs
55 aesonOptions = aesonOptions @xs
@@ -62,8 +60,6 @@ instance KnownSymbol t => OpenApiOptionModifier (Description t) where
62toTextLine :: forall s. KnownSymbol s => Text
60toTextLine :: forall s. KnownSymbol s => Text
63toTextLine = "\n\n" <> T.pack (symbolVal (Proxy @s))
61toTextLine = "\n\n" <> T.pack (symbolVal (Proxy @s))
64
62
65−#endif
66−
67-- $setup
63-- $setup
68-- >>> import qualified Data.Yaml
64-- >>> import qualified Data.Yaml
69-- >>> import qualified Data.ByteString.Char8
65-- >>> import qualified Data.ByteString.Char8
@@ -78,6 +74,13 @@ instance
78 openApiSchemaModifier @xs
74 openApiSchemaModifier @xs
79 <$> genericDeclareNamedSchema (openApiOptionsModifier @xs defaultSchemaOptions) (Proxy @x)
75 <$> genericDeclareNamedSchema (openApiOptionsModifier @xs defaultSchemaOptions) (Proxy @x)
80
76
77+instance
78+ (OpenApiOptionModifier xs, GToParamSchema (Rep x), Generic x) =>
79+ ToParamSchema (CustomJSON (xs :: k) x)
80+ where
81+ toParamSchema Proxy =
82+ genericToParamSchema (openApiOptionsModifier @xs defaultSchemaOptions) (Proxy @x)
83+
81class OpenApiOptionModifier x where
84class OpenApiOptionModifier x where
82 openApiOptionsModifier :: SchemaOptions -> SchemaOptions
85 openApiOptionsModifier :: SchemaOptions -> SchemaOptions
83 openApiOptionsModifier = id
86 openApiOptionsModifier = id
@@ -99,8 +102,10 @@ instance OpenApiOptionModifier UnwrapUnaryRecords where
99
102
100instance OpenApiOptionModifier OmitNothingFields
103instance OpenApiOptionModifier OmitNothingFields
101
104
105+#if MIN_VERSION_deriving_aeson(0,2,4)
102instance OpenApiOptionModifier RejectUnknownFields where
106instance OpenApiOptionModifier RejectUnknownFields where
103 openApiSchemaModifier = schema . additionalProperties .~ Just (AdditionalPropertiesAllowed False)
107 openApiSchemaModifier = schema . additionalProperties .~ Just (AdditionalPropertiesAllowed False)
108+#endif
104
109
105instance StringModifier f => OpenApiOptionModifier (FieldLabelModifier f) where
110instance StringModifier f => OpenApiOptionModifier (FieldLabelModifier f) where
106 openApiOptionsModifier o = o {fieldLabelModifier = getStringModifier @f}
111 openApiOptionsModifier o = o {fieldLabelModifier = getStringModifier @f}