@@ -5,32 +5,60 @@ module Deriving.OpenApi
5 DatatypeNameModifier,
5 DatatypeNameModifier,
7 module Deriving.Aeson,
7 module Deriving.Aeson,
11import qualified Data.Aeson.Types as A
13import qualified Data.Aeson.Types as A
12import Data.Kind
14import Data.Kind
13import Data.OpenApi
15import Data.OpenApi
14import Data.OpenApi.Internal.Schema
16import Data.OpenApi.Internal.Schema
15import Data.Proxy
17import Data.Proxy
18+import Data.Text (Text)
19+import qualified Data.Text as T
16import Deriving.Aeson
20import Deriving.Aeson
17import GHC.Generics
21import GHC.Generics
18import GHC.TypeLits
22import GHC.TypeLits
20type CustomOpenApi = CustomJSON
25type CustomOpenApi = CustomJSON
22instance (OpenApiOptions xs, GToSchema (Rep x), Generic x) => ToSchema (CustomJSON xs x) where
27instance (OpenApiOptions xs, GToSchema (Rep x), Generic x) => ToSchema (CustomJSON xs x) where
28+ declareNamedSchema Proxy =
23− declareNamedSchema Proxy = genericDeclareNamedSchema (openApiOptions @xs) (Proxy @x)
29+ openApiSchemaModifier @xs <$> genericDeclareNamedSchema (openApiOptions @xs) (Proxy @x)
25data DatatypeNameModifier t
31data DatatypeNameModifier t
27instance (StringModifier f, OpenApiOptions xs) => OpenApiOptions (DatatypeNameModifier f ': xs) where
33instance (StringModifier f, OpenApiOptions xs) => OpenApiOptions (DatatypeNameModifier f ': xs) where
28 openApiOptions = (openApiOptions @xs) {datatypeNameModifier = getStringModifier @f}
34 openApiOptions = (openApiOptions @xs) {datatypeNameModifier = getStringModifier @f}
36+instance (AesonOptions xs) => AesonOptions (DatatypeNameModifier f ': xs) where
37+ aesonOptions = aesonOptions @xs
39+instance (AesonOptions xs) => AesonOptions (Description f ': xs) where
40+ aesonOptions = aesonOptions @xs
42+instance (OpenApiOptions xs, KnownSymbol t) => OpenApiOptions (Description t ': xs) where
43+ openApiOptions = openApiOptions @xs
44+ openApiSchemaModifier = schema . description <>~ Just (toTextLine @t)
46+toTextLine :: forall s. KnownSymbol s => Text
47+toTextLine = "\n\n" <> T.pack (symbolVal (Proxy @s))
49+type family (++) (x :: [k]) (y :: [k]) :: [k] where
51+ (++) (x ': xs) ys = xs ++ (x ': ys)
53+type family Extending (c :: * -> *) (ee :: [*]) :: * -> * where
54+ Extending (CustomJSON a) ee = CustomJSON (a ++ ee)
30-- deriving-aeson-based instances
56-- deriving-aeson-based instances
32class OpenApiOptions (xs :: [Type]) where
58class OpenApiOptions (xs :: [Type]) where
33 openApiOptions :: SchemaOptions
59 openApiOptions :: SchemaOptions
60+ openApiSchemaModifier :: NamedSchema -> NamedSchema
61+ openApiSchemaModifier = id
35instance OpenApiOptions '[] where
63instance OpenApiOptions '[] where
36 openApiOptions = defaultSchemaOptions
64 openApiOptions = defaultSchemaOptions