Skip to content

properties named "nullable" and subschema components #261

Open
@fradav

Description

@fradav

It’s basically two issues in one: the inability to parse the openapi v3 schema from https://cloud.squidex.io/ (a very nice .net CMS by the way)
Here I provide a script which reproduces the issues, see the comment./
For the nullable named property, re-serializing the schema with Microsoft.OpenApi is a workaround (hence the outputSchemaV3 function to do that.
Anyway, “subcomponent” schema (subschema?) are not parsed or correctly taken into account, see the last comment.

convertedcomponent-schema.json
nullablepropertyandcomponent-schema.json
converted-schema.json
nullableproperty-schema.json

#r "nuget: Microsoft.OpenApi.Readers"
#r "nuget: Microsoft.OpenApi"

open Microsoft.OpenApi.Readers
open Microsoft.OpenApi.Writers
open System.IO

let outputSchemaV3 origin converted =

    let convertedPath = __SOURCE_DIRECTORY__ + "/" + converted
    use convertedStream = File.Create(convertedPath)
    use streamWriter = new StreamWriter(convertedStream)
    let jsonWriter = new OpenApiJsonWriter(streamWriter)

    let openApiDocumentReader = new OpenApiStreamReader()
    let oriiginPath = __SOURCE_DIRECTORY__ + "/" + origin
    use readerStream = File.OpenRead(oriiginPath)

    readerStream |> openApiDocumentReader.Read |> fst |> _.SerializeAsV3(jsonWriter)

    streamWriter.Flush() // Ensure all data is written to the file

outputSchemaV3 "nullableproperty-schema.json" "converted-schema.json"
outputSchemaV3 "nullablepropertyandcomponent-schema.json" "convertedcomponent-schema.json"

#r "nuget: SwaggerProvider"

open SwaggerProvider

[<Literal>]
let schemaPath = __SOURCE_DIRECTORY__ + "/nullableproperty-schema.json"

[<Literal>]
let convertedSchemaPath = __SOURCE_DIRECTORY__ + "/converted-schema.json"

[<Literal>]
let convertedComponentSchemaPath =
    __SOURCE_DIRECTORY__ + "/convertedcomponent-schema.json"

// type BlogApi = OpenApiClientProvider<schemaPath>
// The type provider 'SwaggerProvider.OpenApiClientTypeProvider' reported an error: Schema parse errors:
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/post/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/patch/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/delete/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1validity/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1defaults/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1status/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/post/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/patch/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/delete/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1validity/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1defaults/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1status/put/parameters @


type BlogApi = OpenApiClientProvider<convertedSchemaPath>

let page = BlogApi.PagesContentDto()
page.Data <- BlogApi.PagesDataDto()
page.Data.Title <- Map [ "iv", "Hello, world!" ]
// OK

type BlogApiComponent = OpenApiClientProvider<convertedComponentSchemaPath>

let alternativeTitleComponent =
    BlogApiComponent.PagesDataDto_AlternativeTitle_Item()
// alternativeTitleComponent.Title <- Map [ "iv", "Hello, world!" ] // Not OK, Title should be a property of the component

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions