@@ -0,0 +1,71 @@
1+{-# OPTIONS_GHC -Wno-orphans #-}
3+module Deriving.OpenApi
6+ module Deriving.Aeson,
10+import qualified Data.Aeson.Types as A
13+import Data.OpenApi.Internal.Schema
19+type CustomOpenApi = CustomJSON
21+instance (OpenApiOptions xs, GToSchema (Rep x), Generic x) => ToSchema (CustomJSON xs x) where
22+ declareNamedSchema Proxy = genericDeclareNamedSchema (openApiOptions @xs) (Proxy @x)
24+data DatatypeNameModifier t
26+instance (StringModifier f, OpenApiOptions xs) => OpenApiOptions (DatatypeNameModifier f ': xs) where
27+ openApiOptions = (openApiOptions @xs) {datatypeNameModifier = getStringModifier @f}
29+-- deriving-aeson-based instances
31+class OpenApiOptions (xs :: [Type]) where
32+ openApiOptions :: SchemaOptions
34+instance OpenApiOptions '[] where
35+ openApiOptions = defaultSchemaOptions
37+instance OpenApiOptions xs => OpenApiOptions (UnwrapUnaryRecords ': xs) where
38+ openApiOptions = (openApiOptions @xs) {unwrapUnaryRecords = True}
40+instance OpenApiOptions xs => OpenApiOptions (OmitNothingFields ': xs) where
41+ openApiOptions = openApiOptions @xs
43+instance OpenApiOptions xs => OpenApiOptions (RejectUnknownFields ': xs) where
44+ openApiOptions = openApiOptions @xs
46+instance (StringModifier f, OpenApiOptions xs) => OpenApiOptions (FieldLabelModifier f ': xs) where
47+ openApiOptions = (openApiOptions @xs) {fieldLabelModifier = getStringModifier @f}
49+instance (StringModifier f, OpenApiOptions xs) => OpenApiOptions (ConstructorTagModifier f ': xs) where
50+ openApiOptions = (openApiOptions @xs) {constructorTagModifier = getStringModifier @f}
53+ (OpenApiOptions xs, TypeError ( 'Text "openapi3-deriving does not currently the `TagSingleConstructors` modifier.")) =>
54+ OpenApiOptions (TagSingleConstructors ': xs)
56+ openApiOptions = undefined
58+instance OpenApiOptions xs => OpenApiOptions (NoAllNullaryToStringTag ': xs) where
59+ openApiOptions = (openApiOptions @xs) {allNullaryToStringTag = False}
61+instance (KnownSymbol t, KnownSymbol c, OpenApiOptions xs) => OpenApiOptions (SumTaggedObject t c ': xs) where
62+ openApiOptions = (openApiOptions @xs) {sumEncoding = A.TaggedObject (symbolVal (Proxy @t)) (symbolVal (Proxy @c))}
64+instance (OpenApiOptions xs) => OpenApiOptions (SumUntaggedValue ': xs) where
65+ openApiOptions = (openApiOptions @xs) {sumEncoding = A.UntaggedValue}
67+instance (OpenApiOptions xs) => OpenApiOptions (SumObjectWithSingleField ': xs) where
68+ openApiOptions = (openApiOptions @xs) {sumEncoding = A.ObjectWithSingleField}
70+instance (OpenApiOptions xs) => OpenApiOptions (SumTwoElemArray ': xs) where
71+ openApiOptions = (openApiOptions @xs) {sumEncoding = A.TwoElemArray}