Skip to content

Commit

Permalink
Add typeOptions support for oneOf/Unions
Browse files Browse the repository at this point in the history
  • Loading branch information
ysangkok committed Sep 18, 2024
1 parent 21c4214 commit cda1a64
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 12 deletions.
15 changes: 8 additions & 7 deletions json-fleece-codegen-util/src/Fleece/CodeGenUtil.hs
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ mkReferencesMap =
<> maybe mempty mkAdditionalPropertiesReferences mbAdditionalProperties
CodeGenArray _options _mbMaxLength ref ->
mkSingletonReference ArrayItemSource ref
CodeGenUnion members ->
CodeGenUnion _options members ->
foldMap mkUnionMemberReferences members
CodeGenTaggedUnion discriminatorProperty members ->
foldMap
Expand Down Expand Up @@ -335,7 +335,7 @@ data CodeGenDataFormat
| CodeGenEnum TypeOptions [T.Text]
| CodeGenObject TypeOptions [CodeGenObjectField] (Maybe CodeGenAdditionalProperties)
| CodeGenArray TypeOptions (Maybe Integer) CodeGenRefType
| CodeGenUnion [CodeGenUnionMember]
| CodeGenUnion TypeOptions [CodeGenUnionMember]
| CodeGenTaggedUnion T.Text [CodeGenTaggedUnionMember]

codeGenNewTypeSchemaTypeInfo :: TypeOptions -> SchemaTypeInfo -> CodeGenDataFormat
Expand Down Expand Up @@ -1235,8 +1235,8 @@ generateCodeGenDataFormat typeMap references typeName format = do
generateFleeceObject typeMap references typeName fields mbAdditionalProperties typeOptions
CodeGenArray typeOptions mbMinItems itemType ->
generateFleeceArray typeMap typeName mbMinItems itemType typeOptions
CodeGenUnion members ->
generateFleeceUnion typeMap typeName members
CodeGenUnion typeOptions members ->
generateFleeceUnion typeMap typeName members typeOptions
CodeGenTaggedUnion tagProperty members ->
generateFleeceTaggedUnion typeMap typeName tagProperty members

Expand All @@ -1249,7 +1249,7 @@ requiredPragmasForFormat format =
CodeGenEnum _ _ -> []
CodeGenObject _ _ _ -> []
CodeGenArray _ _ _ -> []
CodeGenUnion _ ->
CodeGenUnion _ _ ->
[ "{-# LANGUAGE DataKinds #-}"
]
CodeGenTaggedUnion _ _ ->
Expand Down Expand Up @@ -1467,8 +1467,9 @@ generateFleeceUnion ::
CodeGenMap ->
HC.TypeName ->
[CodeGenUnionMember] ->
TypeOptions ->
CodeGen ([HC.VarName], HC.HaskellCode)
generateFleeceUnion typeMap typeName members = do
generateFleeceUnion typeMap typeName members typeOptions = do
typeInfos <-
traverse
(schemaInfoOrRefToSchemaTypeInfo typeMap . codeGenUnionMemberType)
Expand Down Expand Up @@ -1512,7 +1513,7 @@ generateFleeceUnion typeMap typeName members = do
HC.newtype_
typeName
("(" <> HC.union (schemaTypeExpr <$> typeInfos) <> ")")
Nothing
(deriveClassNames typeOptions)

extraExports =
[]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import qualified TestCases.Types.DateTimeFormats.DefaultTimeField as DefaultTime
import qualified TestCases.Types.DateTimeFormats.LocalTimeField as LocalTimeField
import qualified TestCases.Types.DateTimeFormats.UtcTimeField as UtcTimeField
import qualified TestCases.Types.DateTimeFormats.ZonedTimeField as ZonedTimeField
import qualified TestCases.Types.DateTimeFormats.ZonedTimeInUnionField as ZonedTimeInUnionField

data DateTimeFormats = DateTimeFormats
{ zonedTimeField :: Maybe ZonedTimeField.ZonedTimeField
Expand All @@ -24,6 +25,7 @@ data DateTimeFormats = DateTimeFormats
, utcTimeField :: Maybe UtcTimeField.UtcTimeField
, customZonedTimeField :: Maybe CustomZonedTimeField.CustomZonedTimeField
, customUtcTimeField :: Maybe CustomUtcTimeField.CustomUtcTimeField
, zonedTimeInUnionField :: Maybe ZonedTimeInUnionField.ZonedTimeInUnionField
}
deriving (Show)

Expand All @@ -37,4 +39,5 @@ dateTimeFormatsSchema =
#+ FC.optional "customLocalTimeField" customLocalTimeField CustomLocalTimeField.customLocalTimeFieldSchema
#+ FC.optional "utcTimeField" utcTimeField UtcTimeField.utcTimeFieldSchema
#+ FC.optional "customZonedTimeField" customZonedTimeField CustomZonedTimeField.customZonedTimeFieldSchema
#+ FC.optional "customUtcTimeField" customUtcTimeField CustomUtcTimeField.customUtcTimeFieldSchema
#+ FC.optional "customUtcTimeField" customUtcTimeField CustomUtcTimeField.customUtcTimeFieldSchema
#+ FC.optional "zonedTimeInUnionField" zonedTimeInUnionField ZonedTimeInUnionField.zonedTimeInUnionFieldSchema
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DataKinds #-}

module TestCases.Types.DateTimeFormats.ZonedTimeInUnionField
( ZonedTimeInUnionField(..)
, zonedTimeInUnionFieldSchema
) where

import qualified Data.Text as T
import Fleece.Core ((#|))
import qualified Fleece.Core as FC
import Prelude (($), Show)
import qualified Shrubbery as Shrubbery
import qualified TestCases.Types.ZonedTimeType as ZonedTimeType

newtype ZonedTimeInUnionField = ZonedTimeInUnionField (Shrubbery.Union
'[ ZonedTimeType.ZonedTimeType
, T.Text
])
deriving (Show)

zonedTimeInUnionFieldSchema :: FC.Fleece schema => schema ZonedTimeInUnionField
zonedTimeInUnionFieldSchema =
FC.coerceSchema $
FC.unionNamed (FC.qualifiedName "TestCases.Types.DateTimeFormats.ZonedTimeInUnionField" "ZonedTimeInUnionField") $
FC.unionMember ZonedTimeType.zonedTimeTypeSchema
#| FC.unionMember FC.text
6 changes: 6 additions & 0 deletions json-fleece-openapi3/examples/test-cases/codegen.dhall
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ in
, formatSpecifier = Some "local"
}
}
, { type = "TestCases.Types.DateTimeFormats.ZonedTimeInUnionField.ZonedTimeInUnionField"
, options =
CodeGen.TypeOptions::
{ deriveClasses = CodeGen.derive [ CodeGen.show ]
}
}
, { type = "TestCases.Types.UtcTimeType.UtcTimeType"
, options =
CodeGen.TypeOptions::
Expand Down
1 change: 1 addition & 0 deletions json-fleece-openapi3/examples/test-cases/test-cases.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ library
TestCases.Types.DateTimeFormats.LocalTimeField
TestCases.Types.DateTimeFormats.UtcTimeField
TestCases.Types.DateTimeFormats.ZonedTimeField
TestCases.Types.DateTimeFormats.ZonedTimeInUnionField
TestCases.Types.DefaultTimeType
TestCases.Types.DerivingNothing
TestCases.Types.EnumIntParam
Expand Down
5 changes: 5 additions & 0 deletions json-fleece-openapi3/examples/test-cases/test-cases.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,11 @@ components:
customLocalTimeField:
type: string
format: date-time
zonedTimeInUnionField:
oneOf:
- $ref: '#/components/schemas/ZonedTimeType'
- type: string
format: date-time # Bug: This doesn't actually change it from being a Text in the generated code

DefaultTimeType:
type: string
Expand Down
1 change: 1 addition & 0 deletions json-fleece-openapi3/json-fleece-openapi3.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -1940,6 +1940,7 @@ extra-source-files:
examples/test-cases/TestCases/Types/DateTimeFormats/LocalTimeField.hs
examples/test-cases/TestCases/Types/DateTimeFormats/UtcTimeField.hs
examples/test-cases/TestCases/Types/DateTimeFormats/ZonedTimeField.hs
examples/test-cases/TestCases/Types/DateTimeFormats/ZonedTimeInUnionField.hs
examples/test-cases/TestCases/Types/DefaultTimeType.hs
examples/test-cases/TestCases/Types/DerivingNothing.hs
examples/test-cases/TestCases/Types/EnumIntParam.hs
Expand Down
10 changes: 6 additions & 4 deletions json-fleece-openapi3/src/Fleece/OpenApi3.hs
Original file line number Diff line number Diff line change
Expand Up @@ -906,8 +906,9 @@ mkOpenApiDataFormat schemaKey typeName schema =
case OA._schemaOneOf schema of
Just schemas ->
case OA._schemaDiscriminator schema of
Nothing ->
Just <$> mkOneOfUnion schemaKey schemas
Nothing -> do
typeOptions <- CGU.lookupTypeOptions typeName
Just <$> mkOneOfUnion schemaKey typeOptions schemas
Just discriminator ->
Just <$> mkOneOfTaggedUnion discriminator schemaKey
Nothing ->
Expand Down Expand Up @@ -938,9 +939,10 @@ mkOpenApiDataFormat schemaKey typeName schema =

mkOneOfUnion ::
T.Text ->
CGU.TypeOptions ->
[OA.Referenced OA.Schema] ->
CGU.CodeGen (SchemaMap, CGU.CodeGenDataFormat)
mkOneOfUnion schemaKey refSchemas = do
mkOneOfUnion schemaKey typeOptions refSchemas = do
let
processRefSchema refSchema =
case refSchema of
Expand All @@ -967,7 +969,7 @@ mkOneOfUnion schemaKey refSchemas = do

(maps, codeGenUnionMembers) <- fmap unzip . traverse processRefSchema $ refSchemas
schemaMap <- unionsErrorOnConflict maps
pure (schemaMap, CGU.CodeGenUnion codeGenUnionMembers)
pure (schemaMap, CGU.CodeGenUnion typeOptions codeGenUnionMembers)

mkOneOfTaggedUnion ::
OA.Discriminator ->
Expand Down

0 comments on commit cda1a64

Please sign in to comment.