Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ public static class OpenApiConstants
/// </summary>
public const string Title = "title";

/// <summary>
/// Field: Const
/// </summary>
public const string Const = "const";

/// <summary>
/// Field: Type
/// </summary>
Expand Down
7 changes: 7 additions & 0 deletions src/Microsoft.OpenApi/Models/OpenApiSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@
/// </summary>
public virtual JsonSchemaType? Type { get; set; }

/// <summary>
/// Follow JSON Schema definition: https://json-schema.org/draft/2020-12/json-schema-validation
/// </summary>
public virtual string Const { get; set; }

/// <summary>
/// Follow JSON Schema definition: https://tools.ietf.org/html/draft-fge-json-schema-validation-00
/// While relying on JSON Schema's defined formats,
Expand Down Expand Up @@ -347,6 +352,7 @@
{
Title = schema?.Title ?? Title;
Id = schema?.Id ?? Id;
Const = schema?.Const ?? Const;

Check warning

Code scanning / CodeQL

Virtual call in constructor or destructor Warning

Avoid virtual calls in a constructor or destructor.

Check warning

Code scanning / CodeQL

Virtual call in constructor or destructor Warning

Avoid virtual calls in a constructor or destructor.
Schema = schema?.Schema ?? Schema;
Comment = schema?.Comment ?? Comment;
Vocabulary = schema?.Vocabulary != null ? new Dictionary<string, bool>(schema.Vocabulary) : null;
Expand Down Expand Up @@ -563,6 +569,7 @@
writer.WriteProperty(OpenApiConstants.Id, Id);
writer.WriteProperty(OpenApiConstants.DollarSchema, Schema);
writer.WriteProperty(OpenApiConstants.Comment, Comment);
writer.WriteProperty(OpenApiConstants.Const, Const);
writer.WriteOptionalMap(OpenApiConstants.Vocabulary, Vocabulary, (w, s) => w.WriteValue(s));
writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, (w, s) => s.SerializeAsV31(w));
writer.WriteProperty(OpenApiConstants.DynamicRef, DynamicRef);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ internal OpenApiSchemaReference(OpenApiSchema target, string referenceId)
/// <inheritdoc/>
public override JsonSchemaType? Type { get => Target.Type; set => Target.Type = value; }
/// <inheritdoc/>
public override string Const { get => Target.Const; set => Target.Const = value; }
/// <inheritdoc/>
public override string Format { get => Target.Format; set => Target.Format = value; }
/// <inheritdoc/>
public override string Description
Expand Down
4 changes: 4 additions & 0 deletions src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ internal static partial class OpenApiV31Deserializer
}
}
},
{
"const",
(o, n, _) => o.Const = n.GetScalarValue()
},
{
"allOf",
(o, n, t) => o.AllOf = n.CreateList(LoadSchema, t)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -452,5 +452,48 @@ public void SerializeSchemaWithJsonSchemaKeywordsWorks()
schema.Vocabulary.Keys.Count.Should().Be(5);
schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
}

[Fact]
public void ParseSchemaWithConstWorks()
{
var expected = @"{
""$schema"": ""https://json-schema.org/draft/2020-12/schema"",
""required"": [
""status""
],
""type"": ""object"",
""properties"": {
""status"": {
""const"": ""active"",
""type"": ""string""
},
""user"": {
""required"": [
""role""
],
""type"": ""object"",
""properties"": {
""role"": {
""const"": ""admin"",
""type"": ""string""
}
}
}
}
}";

var path = Path.Combine(SampleFolderPath, "schemaWithConst.json");

// Act
var schema = OpenApiModelFactory.Load<OpenApiSchema>(path, OpenApiSpecVersion.OpenApi3_1, out _);
schema.Properties["status"].Const.Should().Be("active");
schema.Properties["user"].Properties["role"].Const.Should().Be("admin");

// serialization
var writer = new StringWriter();
schema.SerializeAsV31(new OpenApiJsonWriter(writer));
var schemaString = writer.ToString();
schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "active"
},
"user": {
"type": "object",
"properties": {
"role": {
"type": "string",
"const": "admin"
}
},
"required": [ "role" ]
}
},
"required": [ "status" ]
}
3 changes: 3 additions & 0 deletions test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@ namespace Microsoft.OpenApi.Models
public const string Comment = "$comment";
public const string Components = "components";
public const string ComponentsSegment = "/components/";
public const string Const = "const";
public const string Consumes = "consumes";
public const string Contact = "contact";
public const string Content = "content";
Expand Down Expand Up @@ -882,6 +883,7 @@ namespace Microsoft.OpenApi.Models
public virtual System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiSchema> AllOf { get; set; }
public virtual System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiSchema> AnyOf { get; set; }
public virtual string Comment { get; set; }
public virtual string Const { get; set; }
public virtual System.Text.Json.Nodes.JsonNode Default { get; set; }
public virtual System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiSchema> Definitions { get; set; }
public virtual bool Deprecated { get; set; }
Expand Down Expand Up @@ -1222,6 +1224,7 @@ namespace Microsoft.OpenApi.Models.References
public override System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiSchema> AllOf { get; set; }
public override System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiSchema> AnyOf { get; set; }
public override string Comment { get; set; }
public override string Const { get; set; }
public override System.Text.Json.Nodes.JsonNode Default { get; set; }
public override System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiSchema> Definitions { get; set; }
public override bool Deprecated { get; set; }
Expand Down
Loading