[csharp-netcore] Better handling of oneOf/anyOf with duplicated data type (#15377)

* better handling of oneOf/anyOf with duplicated data type

* update generichost template

* remove newline in eof

* bug fix (#15413)

---------

Co-authored-by: devhl-labs <shawnkanyer@gmail.com>
This commit is contained in:
William Cheng 2023-05-05 14:25:45 +08:00 committed by GitHub
parent 76c05b2991
commit 7259d812bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
332 changed files with 3796 additions and 20 deletions

View File

@ -43,7 +43,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|packageVersion|C# package version.| |1.0.0|
|releaseNote|Release note, default to 'Minor update'.| |Minor update|
|returnICollection|Return ICollection&lt;T&gt; instead of the concrete type.| |false|
|skipOneOfAnyOfGetter|Skip the generation of getter for sub-schemas in oneOf/anyOf models.| |false|
|sourceFolder|source folder for generated code| |src|
|targetFramework|The target .NET framework version. To target multiple frameworks, use `;` as the separator, e.g. `netstandard2.1;netcoreapp3.1`|<dl><dt>**netstandard1.3**</dt><dd>.NET Standard 1.3 compatible</dd><dt>**netstandard1.4**</dt><dd>.NET Standard 1.4 compatible</dd><dt>**netstandard1.5**</dt><dd>.NET Standard 1.5 compatible</dd><dt>**netstandard1.6**</dt><dd>.NET Standard 1.6 compatible</dd><dt>**netstandard2.0**</dt><dd>.NET Standard 2.0 compatible</dd><dt>**netstandard2.1**</dt><dd>.NET Standard 2.1 compatible</dd><dt>**netcoreapp3.1**</dt><dd>.NET Core 3.1 compatible (End of Support 13 Dec 2022)</dd><dt>**net47**</dt><dd>.NET Framework 4.7 compatible</dd><dt>**net48**</dt><dd>.NET Framework 4.8 compatible</dd><dt>**net6.0**</dt><dd>.NET 6.0 compatible</dd><dt>**net7.0**</dt><dd>.NET 7.0 compatible</dd></dl>|netstandard2.0|
|useCollection|Deserialize array types to Collection&lt;T&gt; instead of List&lt;T&gt;.| |false|

View File

@ -8035,11 +8035,20 @@ public class DefaultCodegen implements CodegenConfig {
return null;
}
List<CodegenProperty> xOf = new ArrayList<>();
Set<String> dataTypeSet = new HashSet<>(); // to keep track of dataType
int i = 0;
for (Schema xOfSchema : xOfCollection) {
CodegenProperty cp = fromProperty(collectionName + "_" + i, xOfSchema, false);
xOf.add(cp);
i += 1;
if (dataTypeSet.contains(cp.dataType)) {
// add "x-duplicated-data-type" to indicate if the dataType already occurs before
// in other sub-schemas of allOf/anyOf/oneOf
cp.vendorExtensions.putIfAbsent("x-duplicated-data-type", true);
} else {
dataTypeSet.add(cp.dataType);
}
}
return xOf;
}

View File

@ -117,10 +117,6 @@ public class CSharpNetCoreClientCodegen extends AbstractCSharpCodegen {
protected boolean needsCustomHttpMethod = false;
protected boolean needsUriBuilder = false;
// skip generation of getter for oneOf/anyOf sub-schemas to avoid duplicate getter
// when the subschemas are of the same type but with different constraints (e.g. array of string)
protected boolean skipOneOfAnyOfGetter = false;
public CSharpNetCoreClientCodegen() {
super();
@ -331,10 +327,6 @@ public class CSharpNetCoreClientCodegen extends AbstractCSharpCodegen {
CodegenConstants.CASE_INSENSITIVE_RESPONSE_HEADERS_DESC,
this.caseInsensitiveResponseHeaders);
addSwitch(CodegenConstants.SKIP_ONEOF_ANYOF_GETTER,
CodegenConstants.SKIP_ONEOF_ANYOF_GETTER_DESC,
this.skipOneOfAnyOfGetter);
regexModifiers = new HashMap<>();
regexModifiers.put('i', "IgnoreCase");
regexModifiers.put('m', "Multiline");
@ -806,7 +798,6 @@ public class CSharpNetCoreClientCodegen extends AbstractCSharpCodegen {
syncBooleanProperty(additionalProperties, CodegenConstants.OPTIONAL_METHOD_ARGUMENT, this::setOptionalMethodArgumentFlag, optionalMethodArgumentFlag);
syncBooleanProperty(additionalProperties, CodegenConstants.NON_PUBLIC_API, this::setNonPublicApi, isNonPublicApi());
syncBooleanProperty(additionalProperties, CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP, this::setUseOneOfDiscriminatorLookup, this.useOneOfDiscriminatorLookup);
syncBooleanProperty(additionalProperties, CodegenConstants.SKIP_ONEOF_ANYOF_GETTER, this::setSkipOneOfAnyOfGetter, this.skipOneOfAnyOfGetter);
syncBooleanProperty(additionalProperties, "supportsFileParameters", this::setSupportsFileParameters, this.supportsFileParameters);
final String testPackageName = testPackageName();
@ -1187,14 +1178,6 @@ public class CSharpNetCoreClientCodegen extends AbstractCSharpCodegen {
return this.useOneOfDiscriminatorLookup;
}
public void setSkipOneOfAnyOfGetter(boolean skipOneOfAnyOfGetter) {
this.skipOneOfAnyOfGetter = skipOneOfAnyOfGetter;
}
public boolean getSkipOneOfAnyOfGetter() {
return this.skipOneOfAnyOfGetter;
}
@Override
public String toEnumVarName(String value, String datatype) {
if (value.length() == 0) {

View File

@ -37,14 +37,18 @@
JsonTokenType startingTokenType = utf8JsonReader.TokenType;
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
Utf8JsonReader {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Reader = utf8JsonReader;
bool {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Deserialized = Client.ClientUtils.TryDeserialize<{{{dataType}}}>(ref {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Reader, jsonSerializerOptions, out {{{dataType}}}{{^isBoolean}}{{nrt?}}{{/isBoolean}} {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}});
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
Utf8JsonReader {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Reader = utf8JsonReader;
bool {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Deserialized = Client.ClientUtils.TryDeserialize<{{{dataType}}}>(ref {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Reader, jsonSerializerOptions, out {{{dataType}}}{{^isBoolean}}{{nrt?}}{{/isBoolean}} {{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}});
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
{{#composedSchemas.allOf}}
{{^isInherited}}
@ -186,9 +190,11 @@
{{/-last}}
{{/nonNullableVars}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
if ({{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}Deserialized)
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_param}}{{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}{{/lambda.camelcase_param}} {{#model.composedSchemas.allOf}}{{^isInherited}}{{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}}{{/isInherited}}{{/model.composedSchemas.allOf}}{{#model.composedSchemas.anyOf}}{{#lambda.camelcase_param}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.camelcase_param}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{#lambda.camelcase_param}}{{name}}{{/lambda.camelcase_param}} {{/allVars}}{{/lambda.joinWithComma}});
{{/vendorExtensions.x-duplicated-data-type}}
{{#-last}}
throw new JsonException();
{{/-last}}
@ -207,8 +213,27 @@
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, {{classname}} {{#lambda.camelcase_param}}{{classname}}{{/lambda.camelcase_param}}, JsonSerializerOptions jsonSerializerOptions)
{
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
System.Text.Json.JsonSerializer.Serialize(writer, {{#lambda.camelcase_param}}{{classname}}{{/lambda.camelcase_param}}.{{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}}, jsonSerializerOptions);
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
System.Text.Json.JsonSerializer.Serialize(writer, {{#lambda.camelcase_param}}{{classname}}{{/lambda.camelcase_param}}.{{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}}, jsonSerializerOptions);
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
{{#composedSchemas.allOf}}
{{^isInherited}}
System.Text.Json.JsonSerializer.Serialize(writer, {{#lambda.camelcase_param}}{{classname}}{{/lambda.camelcase_param}}.{{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}}, jsonSerializerOptions);
{{^composedSchemas}}
writer.WriteStartObject();
{{/isInherited}}
{{/composedSchemas.allOf}}
{{#allVars}}
{{#isString}}
{{^isMap}}
@ -322,5 +347,6 @@
{{/allVars}}
writer.WriteEndObject();
{{/composedSchemas}}
}
}

View File

@ -4,6 +4,7 @@
{{>visibility}} partial class {{classname}}{{#parent}} : {{{.}}}{{/parent}}{{>ImplementsIEquatable}}{{>ImplementsValidatable}}
{
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
/// <summary>
/// Initializes a new instance of the <see cref="{{classname}}" /> class.
/// </summary>
@ -36,6 +37,7 @@
{{/allVars}}
}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
{{^composedSchemas.oneOf}}
/// <summary>
@ -103,6 +105,7 @@
{{/isEnum}}
{{/vars}}
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
/// <summary>
/// {{description}}{{^description}}Gets or Sets {{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}}{{/description}}
/// </summary>{{#description}}
@ -115,8 +118,10 @@
{{/deprecated}}
public {{{dataType}}}{{nrt?}} {{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}} { get; {{^isReadOnly}}set; {{/isReadOnly}}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
/// <summary>
/// {{description}}{{^description}}Gets or Sets {{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}}{{/description}}
/// </summary>{{#description}}
@ -129,6 +134,7 @@
{{/deprecated}}
public {{{dataType}}}{{nrt?}} {{#lambda.titlecase}}{{baseType}}{{#isArray}}{{{dataFormat}}}{{/isArray}}{{/lambda.titlecase}} { get; {{^isReadOnly}}set; {{/isReadOnly}}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
{{#composedSchemas.allOf}}
{{^isInherited}}

View File

@ -24,6 +24,7 @@
{{/isNullable}}
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{^isNull}}
/// <summary>
/// Initializes a new instance of the <see cref="{{classname}}" /> class
@ -38,6 +39,7 @@
}
{{/isNull}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
private Object _actualInstance;
@ -66,6 +68,7 @@
}
}
{{#composedSchemas.anyOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{^isNull}}
/// <summary>
@ -78,6 +81,7 @@
return ({{{dataType}}})this.ActualInstance;
}
{{/isNull}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.anyOf}}
/// <summary>

View File

@ -24,6 +24,7 @@
{{/isNullable}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{^isNull}}
/// <summary>
/// Initializes a new instance of the <see cref="{{classname}}" /> class
@ -38,6 +39,7 @@
}
{{/isNull}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
private Object _actualInstance;
@ -65,8 +67,8 @@
}
}
}
{{^skipOneOfAnyOfGetter}}
{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{^isNull}}
/// <summary>
@ -79,8 +81,8 @@
return ({{{dataType}}})this.ActualInstance;
}
{{/isNull}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/composedSchemas.oneOf}}
{{/skipOneOfAnyOfGetter}}
/// <summary>
/// Returns the string presentation of the object

View File

@ -2273,3 +2273,9 @@ components:
unescapedLiteralString:
type: string
default: C:\Users\username
OneOfString:
oneOf:
- type: string
pattern: ^a
- type: string
pattern: ^b

View File

@ -63,6 +63,7 @@ docs/NullableGuidClass.md
docs/NullableShape.md
docs/NumberOnly.md
docs/ObjectWithDeprecatedFields.md
docs/OneOfString.md
docs/Order.md
docs/OuterComposite.md
docs/OuterEnum.md
@ -180,6 +181,7 @@ src/Org.OpenAPITools/Model/NullableGuidClass.cs
src/Org.OpenAPITools/Model/NullableShape.cs
src/Org.OpenAPITools/Model/NumberOnly.cs
src/Org.OpenAPITools/Model/ObjectWithDeprecatedFields.cs
src/Org.OpenAPITools/Model/OneOfString.cs
src/Org.OpenAPITools/Model/Order.cs
src/Org.OpenAPITools/Model/OuterComposite.cs
src/Org.OpenAPITools/Model/OuterEnum.cs

View File

@ -205,6 +205,7 @@ Class | Method | HTTP request | Description
- [Model.NullableShape](docs/NullableShape.md)
- [Model.NumberOnly](docs/NumberOnly.md)
- [Model.ObjectWithDeprecatedFields](docs/ObjectWithDeprecatedFields.md)
- [Model.OneOfString](docs/OneOfString.md)
- [Model.Order](docs/Order.md)
- [Model.OuterComposite](docs/OuterComposite.md)
- [Model.OuterEnum](docs/OuterEnum.md)

View File

@ -2200,6 +2200,12 @@ components:
default: C:\Users\username
type: string
type: object
OneOfString:
oneOf:
- pattern: ^a
type: string
- pattern: ^b
type: string
_foo_get_default_response:
example:
string:

View File

@ -0,0 +1,9 @@
# Org.OpenAPITools.Model.OneOfString
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -0,0 +1,61 @@
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using Xunit;
using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using Org.OpenAPITools.Model;
using Org.OpenAPITools.Client;
using System.Reflection;
using Newtonsoft.Json;
namespace Org.OpenAPITools.Test.Model
{
/// <summary>
/// Class for testing OneOfString
/// </summary>
/// <remarks>
/// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech).
/// Please update the test case below to test the model.
/// </remarks>
public class OneOfStringTests : IDisposable
{
// TODO uncomment below to declare an instance variable for OneOfString
//private OneOfString instance;
public OneOfStringTests()
{
// TODO uncomment below to create an instance of OneOfString
//instance = new OneOfString();
}
public void Dispose()
{
// Cleanup when everything is done.
}
/// <summary>
/// Test an instance of OneOfString
/// </summary>
[Fact]
public void OneOfStringInstanceTest()
{
// TODO uncomment below to test "IsType" OneOfString
//Assert.IsType<OneOfString>(instance);
}
}
}

View File

@ -0,0 +1,245 @@
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.ComponentModel.DataAnnotations;
using OpenAPIDateConverter = Org.OpenAPITools.Client.OpenAPIDateConverter;
using OpenAPIClientUtils = Org.OpenAPITools.Client.ClientUtils;
using System.Reflection;
namespace Org.OpenAPITools.Model
{
/// <summary>
/// OneOfString
/// </summary>
[JsonConverter(typeof(OneOfStringJsonConverter))]
[DataContract(Name = "OneOfString")]
public partial class OneOfString : AbstractOpenAPISchema, IEquatable<OneOfString>, IValidatableObject
{
/// <summary>
/// Initializes a new instance of the <see cref="OneOfString" /> class
/// with the <see cref="string" /> class
/// </summary>
/// <param name="actualInstance">An instance of string.</param>
public OneOfString(string actualInstance)
{
this.IsNullable = false;
this.SchemaType= "oneOf";
this.ActualInstance = actualInstance ?? throw new ArgumentException("Invalid instance found. Must not be null.");
}
private Object _actualInstance;
/// <summary>
/// Gets or Sets ActualInstance
/// </summary>
public override Object ActualInstance
{
get
{
return _actualInstance;
}
set
{
if (value.GetType() == typeof(string))
{
this._actualInstance = value;
}
else
{
throw new ArgumentException("Invalid instance found. Must be the following types: string");
}
}
}
/// <summary>
/// Get the actual instance of `string`. If the actual instance is not `string`,
/// the InvalidClassException will be thrown
/// </summary>
/// <returns>An instance of string</returns>
public string GetString()
{
return (string)this.ActualInstance;
}
/// <summary>
/// Returns the string presentation of the object
/// </summary>
/// <returns>String presentation of the object</returns>
public override string ToString()
{
var sb = new StringBuilder();
sb.Append("class OneOfString {\n");
sb.Append(" ActualInstance: ").Append(this.ActualInstance).Append("\n");
sb.Append("}\n");
return sb.ToString();
}
/// <summary>
/// Returns the JSON string presentation of the object
/// </summary>
/// <returns>JSON string presentation of the object</returns>
public override string ToJson()
{
return JsonConvert.SerializeObject(this.ActualInstance, OneOfString.SerializerSettings);
}
/// <summary>
/// Converts the JSON string into an instance of OneOfString
/// </summary>
/// <param name="jsonString">JSON string</param>
/// <returns>An instance of OneOfString</returns>
public static OneOfString FromJson(string jsonString)
{
OneOfString newOneOfString = null;
if (string.IsNullOrEmpty(jsonString))
{
return newOneOfString;
}
int match = 0;
List<string> matchedTypes = new List<string>();
try
{
// if it does not contains "AdditionalProperties", use SerializerSettings to deserialize
if (typeof(string).GetProperty("AdditionalProperties") == null)
{
newOneOfString = new OneOfString(JsonConvert.DeserializeObject<string>(jsonString, OneOfString.SerializerSettings));
}
else
{
newOneOfString = new OneOfString(JsonConvert.DeserializeObject<string>(jsonString, OneOfString.AdditionalPropertiesSerializerSettings));
}
matchedTypes.Add("string");
match++;
}
catch (Exception exception)
{
// deserialization failed, try the next one
System.Diagnostics.Debug.WriteLine(string.Format("Failed to deserialize `{0}` into string: {1}", jsonString, exception.ToString()));
}
if (match == 0)
{
throw new InvalidDataException("The JSON string `" + jsonString + "` cannot be deserialized into any schema defined.");
}
else if (match > 1)
{
throw new InvalidDataException("The JSON string `" + jsonString + "` incorrectly matches more than one schema (should be exactly one match): " + matchedTypes);
}
// deserialization is considered successful at this point if no exception has been thrown.
return newOneOfString;
}
/// <summary>
/// Returns true if objects are equal
/// </summary>
/// <param name="input">Object to be compared</param>
/// <returns>Boolean</returns>
public override bool Equals(object input)
{
return OpenAPIClientUtils.compareLogic.Compare(this, input as OneOfString).AreEqual;
}
/// <summary>
/// Returns true if OneOfString instances are equal
/// </summary>
/// <param name="input">Instance of OneOfString to be compared</param>
/// <returns>Boolean</returns>
public bool Equals(OneOfString input)
{
return OpenAPIClientUtils.compareLogic.Compare(this, input).AreEqual;
}
/// <summary>
/// Gets the hash code
/// </summary>
/// <returns>Hash code</returns>
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hashCode = 41;
if (this.ActualInstance != null)
hashCode = hashCode * 59 + this.ActualInstance.GetHashCode();
return hashCode;
}
}
/// <summary>
/// To validate all properties of the instance
/// </summary>
/// <param name="validationContext">Validation context</param>
/// <returns>Validation Result</returns>
IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
yield break;
}
}
/// <summary>
/// Custom JSON converter for OneOfString
/// </summary>
public class OneOfStringJsonConverter : JsonConverter
{
/// <summary>
/// To write the JSON string
/// </summary>
/// <param name="writer">JSON writer</param>
/// <param name="value">Object to be converted into a JSON string</param>
/// <param name="serializer">JSON Serializer</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue((string)(typeof(OneOfString).GetMethod("ToJson").Invoke(value, null)));
}
/// <summary>
/// To convert a JSON string into an object
/// </summary>
/// <param name="reader">JSON reader</param>
/// <param name="objectType">Object type</param>
/// <param name="existingValue">Existing value</param>
/// <param name="serializer">JSON Serializer</param>
/// <returns>The object converted from the JSON string</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if(reader.TokenType != JsonToken.Null)
{
return OneOfString.FromJson(JObject.Load(reader).ToString(Formatting.None));
}
return null;
}
/// <summary>
/// Check if the object can be converted
/// </summary>
/// <param name="objectType">Object type</param>
/// <returns>True if the object can be converted</returns>
public override bool CanConvert(Type objectType)
{
return false;
}
}
}

View File

@ -66,6 +66,7 @@ docs/models/NullableGuidClass.md
docs/models/NullableShape.md
docs/models/NumberOnly.md
docs/models/ObjectWithDeprecatedFields.md
docs/models/OneOfString.md
docs/models/Order.md
docs/models/OuterComposite.md
docs/models/OuterEnum.md
@ -186,6 +187,7 @@ src/Org.OpenAPITools/Model/NullableGuidClass.cs
src/Org.OpenAPITools/Model/NullableShape.cs
src/Org.OpenAPITools/Model/NumberOnly.cs
src/Org.OpenAPITools/Model/ObjectWithDeprecatedFields.cs
src/Org.OpenAPITools/Model/OneOfString.cs
src/Org.OpenAPITools/Model/Order.cs
src/Org.OpenAPITools/Model/OuterComposite.cs
src/Org.OpenAPITools/Model/OuterEnum.cs

View File

@ -2200,6 +2200,12 @@ components:
default: C:\Users\username
type: string
type: object
OneOfString:
oneOf:
- pattern: ^a
type: string
- pattern: ^b
type: string
_foo_get_default_response:
example:
string:

View File

@ -0,0 +1,9 @@
# Org.OpenAPITools.Model.OneOfString
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)

View File

@ -0,0 +1,60 @@
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
using Xunit;
using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using Org.OpenAPITools.Model;
using Org.OpenAPITools.Client;
using System.Reflection;
namespace Org.OpenAPITools.Test.Model
{
/// <summary>
/// Class for testing OneOfString
/// </summary>
/// <remarks>
/// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech).
/// Please update the test case below to test the model.
/// </remarks>
public class OneOfStringTests : IDisposable
{
// TODO uncomment below to declare an instance variable for OneOfString
//private OneOfString instance;
public OneOfStringTests()
{
// TODO uncomment below to create an instance of OneOfString
//instance = new OneOfString();
}
public void Dispose()
{
// Cleanup when everything is done.
}
/// <summary>
/// Test an instance of OneOfString
/// </summary>
[Fact]
public void OneOfStringInstanceTest()
{
// TODO uncomment below to test "IsType" OneOfString
//Assert.IsType<OneOfString>(instance);
}
}
}

View File

@ -104,6 +104,7 @@ namespace Org.OpenAPITools.Client
_jsonOptions.Converters.Add(new NullableShapeJsonConverter());
_jsonOptions.Converters.Add(new NumberOnlyJsonConverter());
_jsonOptions.Converters.Add(new ObjectWithDeprecatedFieldsJsonConverter());
_jsonOptions.Converters.Add(new OneOfStringJsonConverter());
_jsonOptions.Converters.Add(new OrderJsonConverter());
_jsonOptions.Converters.Add(new OuterCompositeJsonConverter());
_jsonOptions.Converters.Add(new OuterEnumConverter());

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Activity
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ActivityOutputElementRepresentation
/// </summary>

View File

@ -141,6 +141,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type AdditionalPropertiesClass
/// </summary>

View File

@ -96,6 +96,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Animal
/// </summary>

View File

@ -95,6 +95,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ApiResponse
/// </summary>

View File

@ -100,6 +100,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Apple
/// </summary>

View File

@ -79,6 +79,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type AppleReq
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ArrayOfArrayOfNumberOnly
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ArrayOfNumberOnly
/// </summary>

View File

@ -95,6 +95,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ArrayTest
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Banana
/// </summary>

View File

@ -79,6 +79,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type BananaReq
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type BasquePig
/// </summary>

View File

@ -123,6 +123,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Capitalization
/// </summary>

View File

@ -68,6 +68,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Cat
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type CatAllOf
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Category
/// </summary>

View File

@ -60,6 +60,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ChildCat
/// </summary>

View File

@ -125,6 +125,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ChildCatAllOf
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ClassModel
/// </summary>

View File

@ -82,6 +82,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ComplexQuadrilateral
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type DanishPig
/// </summary>

View File

@ -78,6 +78,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type DateOnlyClass
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type DeprecatedObject
/// </summary>

View File

@ -61,6 +61,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Dog
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type DogAllOf
/// </summary>

View File

@ -98,6 +98,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Drawing
/// </summary>

View File

@ -186,6 +186,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type EnumArrays
/// </summary>

View File

@ -409,6 +409,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type EnumTest
/// </summary>

View File

@ -82,6 +82,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type EquilateralTriangle
/// </summary>

View File

@ -78,6 +78,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type File
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type FileSchemaTestClass
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Foo
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type FooGetDefaultResponse
/// </summary>

View File

@ -357,6 +357,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type FormatTest
/// </summary>

View File

@ -94,6 +94,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Fruit
/// </summary>

View File

@ -83,6 +83,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type FruitReq
/// </summary>

View File

@ -84,6 +84,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type GmFruit
/// </summary>

View File

@ -87,6 +87,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type GrandparentAnimal
/// </summary>

View File

@ -123,6 +123,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type HasOnlyReadOnly
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type HealthCheckResult
/// </summary>

View File

@ -75,6 +75,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type IsoscelesTriangle
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type List
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type LiteralStringClass
/// </summary>

View File

@ -115,6 +115,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Mammal
/// </summary>

View File

@ -154,6 +154,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type MapTest
/// </summary>

View File

@ -111,6 +111,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type MixedPropertiesAndAdditionalPropertiesClass
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Model200Response
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ModelClient
/// </summary>

View File

@ -141,6 +141,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Name
/// </summary>

View File

@ -170,6 +170,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type NullableClass
/// </summary>

View File

@ -78,6 +78,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type NullableGuidClass
/// </summary>

View File

@ -100,6 +100,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type NullableShape
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type NumberOnly
/// </summary>

View File

@ -107,6 +107,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ObjectWithDeprecatedFields
/// </summary>

View File

@ -0,0 +1,147 @@
// <auto-generated>
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/
#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.ComponentModel.DataAnnotations;
using OpenAPIClientUtils = Org.OpenAPITools.Client.ClientUtils;
namespace Org.OpenAPITools.Model
{
/// <summary>
/// OneOfString
/// </summary>
public partial class OneOfString : IValidatableObject
{
/// <summary>
/// Initializes a new instance of the <see cref="OneOfString" /> class.
/// </summary>
/// <param name="_string"></param>
[JsonConstructor]
internal OneOfString(string _string)
{
String = _string;
}
/// <summary>
/// Gets or Sets String
/// </summary>
public string? String { get; set; }
/// <summary>
/// Gets or Sets additional properties
/// </summary>
[JsonExtensionData]
public Dictionary<string, JsonElement> AdditionalProperties { get; } = new Dictionary<string, JsonElement>();
/// <summary>
/// Returns the string presentation of the object
/// </summary>
/// <returns>String presentation of the object</returns>
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append("class OneOfString {\n");
sb.Append(" AdditionalProperties: ").Append(AdditionalProperties).Append("\n");
sb.Append("}\n");
return sb.ToString();
}
/// <summary>
/// To validate all properties of the instance
/// </summary>
/// <param name="validationContext">Validation context</param>
/// <returns>Validation Result</returns>
IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
yield break;
}
}
/// <summary>
/// A Json converter for type OneOfString
/// </summary>
public class OneOfStringJsonConverter : JsonConverter<OneOfString>
{
/// <summary>
/// A Json reader.
/// </summary>
/// <param name="utf8JsonReader"></param>
/// <param name="typeToConvert"></param>
/// <param name="jsonSerializerOptions"></param>
/// <returns></returns>
/// <exception cref="JsonException"></exception>
public override OneOfString Read(ref Utf8JsonReader utf8JsonReader, Type typeToConvert, JsonSerializerOptions jsonSerializerOptions)
{
int currentDepth = utf8JsonReader.CurrentDepth;
if (utf8JsonReader.TokenType != JsonTokenType.StartObject && utf8JsonReader.TokenType != JsonTokenType.StartArray)
throw new JsonException();
JsonTokenType startingTokenType = utf8JsonReader.TokenType;
Utf8JsonReader _stringReader = utf8JsonReader;
bool _stringDeserialized = Client.ClientUtils.TryDeserialize<string>(ref _stringReader, jsonSerializerOptions, out string? _string);
while (utf8JsonReader.Read())
{
if (startingTokenType == JsonTokenType.StartObject && utf8JsonReader.TokenType == JsonTokenType.EndObject && currentDepth == utf8JsonReader.CurrentDepth)
break;
if (startingTokenType == JsonTokenType.StartArray && utf8JsonReader.TokenType == JsonTokenType.EndArray && currentDepth == utf8JsonReader.CurrentDepth)
break;
if (utf8JsonReader.TokenType == JsonTokenType.PropertyName && currentDepth == utf8JsonReader.CurrentDepth - 1)
{
string? propertyName = utf8JsonReader.GetString();
utf8JsonReader.Read();
switch (propertyName)
{
default:
break;
}
}
}
if (_stringDeserialized)
return new OneOfString(_string);
throw new JsonException();
}
/// <summary>
/// A Json writer
/// </summary>
/// <param name="writer"></param>
/// <param name="oneOfString"></param>
/// <param name="jsonSerializerOptions"></param>
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonSerializerOptions jsonSerializerOptions)
{
writer.WriteStartObject();
writer.WriteEndObject();
}
}
}

View File

@ -186,6 +186,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Order
/// </summary>

View File

@ -95,6 +95,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type OuterComposite
/// </summary>

View File

@ -53,6 +53,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ParentPet
/// </summary>

View File

@ -186,6 +186,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Pet
/// </summary>

View File

@ -100,6 +100,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Pig
/// </summary>

View File

@ -120,6 +120,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type PolymorphicProperty
/// </summary>

View File

@ -100,6 +100,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Quadrilateral
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type QuadrilateralInterface
/// </summary>

View File

@ -122,6 +122,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ReadOnlyFirst
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Return
/// </summary>

View File

@ -82,6 +82,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ScaleneTriangle
/// </summary>

View File

@ -111,6 +111,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Shape
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ShapeInterface
/// </summary>

View File

@ -111,6 +111,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type ShapeOrNull
/// </summary>

View File

@ -82,6 +82,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type SimpleQuadrilateral
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type SpecialModelName
/// </summary>

View File

@ -86,6 +86,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Tag
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type TestCollectionEndingWithWordList
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type TestCollectionEndingWithWordListObject
/// </summary>

View File

@ -141,6 +141,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Triangle
/// </summary>

View File

@ -77,6 +77,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type TriangleInterface
/// </summary>

View File

@ -181,6 +181,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type User
/// </summary>

View File

@ -95,6 +95,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Whale
/// </summary>

View File

@ -148,6 +148,7 @@ namespace Org.OpenAPITools.Model
}
}
/// <summary>
/// A Json converter for type Zebra
/// </summary>

View File

@ -66,6 +66,7 @@ docs/models/NullableGuidClass.md
docs/models/NullableShape.md
docs/models/NumberOnly.md
docs/models/ObjectWithDeprecatedFields.md
docs/models/OneOfString.md
docs/models/Order.md
docs/models/OuterComposite.md
docs/models/OuterEnum.md
@ -186,6 +187,7 @@ src/Org.OpenAPITools/Model/NullableGuidClass.cs
src/Org.OpenAPITools/Model/NullableShape.cs
src/Org.OpenAPITools/Model/NumberOnly.cs
src/Org.OpenAPITools/Model/ObjectWithDeprecatedFields.cs
src/Org.OpenAPITools/Model/OneOfString.cs
src/Org.OpenAPITools/Model/Order.cs
src/Org.OpenAPITools/Model/OuterComposite.cs
src/Org.OpenAPITools/Model/OuterEnum.cs

Some files were not shown because too many files have changed in this diff Show More