Skip to content

Commit

Permalink
Improved discriminator handling, RicoSuter/NSwag#945
Browse files Browse the repository at this point in the history
  • Loading branch information
RicoSuter committed Mar 16, 2018
1 parent 834d6cd commit 6feb227
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ public class ClassTemplateModel : ClassTemplateModelBase
public bool HasDiscriminator => !string.IsNullOrEmpty(_schema.Discriminator);

/// <summary>Gets a value indicating whether the class or an inherited class has a discriminator property.</summary>
public bool HasBaseDiscriminator => !string.IsNullOrEmpty(_schema.BaseDiscriminator);
public bool HasBaseDiscriminator => _schema.BaseDiscriminator != null;

/// <summary>Gets the class discriminator property name (may be defined in a inherited class).</summary>
public string BaseDiscriminator => _schema.BaseDiscriminator;
public string BaseDiscriminator => _schema.BaseDiscriminator?.PropertyName;

/// <summary>Gets a value indicating whether the class has description.</summary>
public bool HasDescription => !(_schema is JsonProperty) && !string.IsNullOrEmpty(_schema.Description);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public override string Resolve(JsonSchema4 schema, bool isNullable, string typeN
/// <returns>The result.</returns>
public bool SupportsConstructorConversion(JsonSchema4 schema)
{
return string.IsNullOrEmpty(schema?.ActualSchema.BaseDiscriminator);
return schema?.ActualSchema.BaseDiscriminator == null;
}

private string Resolve(JsonSchema4 schema, string typeNameHint, bool addInterfacePrefix)
Expand Down Expand Up @@ -124,7 +124,7 @@ private string ResolveString(JsonSchema4 schema, string typeNameHint)
if (schema.Format == JsonFormatStrings.TimeSpan)
return "string";
}
else if (Settings.DateTimeType == TypeScriptDateTimeType.MomentJS ||
else if (Settings.DateTimeType == TypeScriptDateTimeType.MomentJS ||
Settings.DateTimeType == TypeScriptDateTimeType.OffsetMomentJS)
{
if (schema.Format == JsonFormatStrings.Date)
Expand Down
16 changes: 11 additions & 5 deletions src/NJsonSchema.CodeGeneration/Models/ClassTemplateModelBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,23 @@ protected ClassTemplateModelBase(TypeResolverBase resolver, JsonSchema4 schema,
/// <summary>Gets the derived class names (discriminator key/type name).</summary>
public ICollection<DerivedClassModel> DerivedClasses => _schema
.GetDerivedSchemas(_rootObject)
.Select(p => new DerivedClassModel(p.Value, _resolver.GetOrGenerateTypeName(p.Key, p.Value), p.Key.ActualTypeSchema.IsAbstract))
.Select(p => new DerivedClassModel(p.Value, p.Key, _schema.ActualSchema.BaseDiscriminator, _resolver))
.ToList();

/// <summary>The model of a derived class.</summary>
public class DerivedClassModel
{
internal DerivedClassModel(string discriminator, string className, bool isAbstract)
internal DerivedClassModel(string typeName, JsonSchema4 schema, OpenApiDiscriminator discriminator, TypeResolverBase resolver)
{
ClassName = className;
IsAbstract = isAbstract;
Discriminator = !string.IsNullOrEmpty(discriminator) ? discriminator : className;
var mapping = discriminator.Mapping.SingleOrDefault(m => m.Value.ActualSchema == schema.ActualSchema);

ClassName = resolver.GetOrGenerateTypeName(schema, typeName);
IsAbstract = schema.ActualTypeSchema.IsAbstract;

Discriminator =
mapping.Value != null ? mapping.Key :
!string.IsNullOrEmpty(typeName) ? typeName :
ClassName;
}

/// <summary>Gets the discriminator.</summary>
Expand Down
15 changes: 1 addition & 14 deletions src/NJsonSchema/JsonSchema4.cs
Original file line number Diff line number Diff line change
Expand Up @@ -279,20 +279,7 @@ public bool Inherits(JsonSchema4 schema)

/// <summary>Gets the discriminator or discriminator of an inherited schema (or null).</summary>
[JsonIgnore]
public string BaseDiscriminator
{
get
{
if (!string.IsNullOrEmpty(Discriminator))
return Discriminator;

var baseDiscriminator = InheritedSchema?.ActualSchema.BaseDiscriminator;
if (!string.IsNullOrEmpty(baseDiscriminator))
return baseDiscriminator;

return null;
}
}
public OpenApiDiscriminator BaseDiscriminator => DiscriminatorObject ?? InheritedSchema?.ActualSchema.BaseDiscriminator;

/// <summary>Gets all properties of this schema (i.e. all direct properties and properties from the schemas in allOf which do not have a type).</summary>
/// <remarks>Used for code generation.</remarks>
Expand Down

0 comments on commit 6feb227

Please sign in to comment.