Skip to content

Commit

Permalink
support additional numeric schema types (#135)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrdouceur authored Oct 1, 2024
1 parent b26a583 commit 16fa4a9
Show file tree
Hide file tree
Showing 877 changed files with 38,579 additions and 23,134 deletions.
50 changes: 43 additions & 7 deletions dotnet/gen/ParserGenerator/MaterialClassValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ private static void AddValidationChecks(int dtdlVersion, CsClass obverseClass, C

if (instanceConditionDigest.Pattern != null)
{
AddPatternCheck(dtdlVersion, obverseClass, scope, instanceConditionDigest.Pattern, $"{eltVar}.GetString()", $"{level}Value", termination, conformanceText);
AddPatternCheck(dtdlVersion, obverseClass, scope, instanceConditionDigest.Pattern, $"{eltVar}.{(instanceConditionDigest.JsonType == "string" ? "GetString" : "GetRawText")}()", $"{level}Value", termination, conformanceText);
}

if (instanceConditionDigest.NamePattern != null)
Expand Down Expand Up @@ -283,14 +283,16 @@ private static void AddJsonTypeCheck(CsScope scope, string jsonType, string eltV

private static void AddDatatypeCheck(CsScope scope, string datatype, string eltVar, string termination, string conformanceText)
{
if (TryGetIntegralType(datatype, out string csType))
{
scope.If($"!{csType}.TryParse({eltVar}.GetRawText(), out {csType} _)")
.Line($"violations.Add($\"{{{eltVar}.GetRawText()}} does not conform to {conformanceText}\");")
.Line($"{termination};");
return;
}

switch (datatype)
{
case "int":
case "long":
scope.If($"!{datatype}.TryParse({eltVar}.GetRawText(), out {datatype} _)")
.Line($"violations.Add($\"{{{eltVar}.GetRawText()}} does not conform to {conformanceText}\");")
.Line($"{termination};");
break;
case "float":
case "double":
scope.If($"!{datatype}.TryParse({eltVar}.GetRawText(), out {datatype} val) || {datatype}.IsInfinity(val)")
Expand All @@ -307,6 +309,40 @@ private static void AddDatatypeCheck(CsScope scope, string datatype, string eltV
}
}

private static bool TryGetIntegralType(string datatype, out string csType)
{
switch (datatype)
{
case "byte":
csType = "sbyte";
return true;
case "int":
csType = "int";
return true;
case "long":
csType = "long";
return true;
case "short":
csType = "short";
return true;
case "unsignedByte":
csType = "byte";
return true;
case "unsignedInt":
csType = "uint";
return true;
case "unsignedLong":
csType = "ulong";
return true;
case "unsignedShort":
csType = "ushort";
return true;
default:
csType = string.Empty;
return false;
}
}

private static void AddInstancePropertyCheck(int dtdlVersion, CsScope scope, string instanceProperty, Dictionary<string, MaterialPropertyDigest> propertyDigests, Dictionary<string, InstanceValidationDigest> classInstanceValidationDigests, string eltVar, string nameVar, string termination)
{
string propertyName = NameFormatter.FormatNameAsProperty(instanceProperty);
Expand Down
24 changes: 24 additions & 0 deletions dotnet/src/DTDLParser/LiteralValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ internal static bool HasValue(JsonElement elt, object value)
{
return elt.ValueKind == JsonValueKind.String && (string)value == elt.GetString();
}
else if (valueType == typeof(sbyte))
{
return elt.ValueKind == JsonValueKind.Number && (sbyte)value == elt.GetSByte();
}
else if (valueType == typeof(short))
{
return elt.ValueKind == JsonValueKind.Number && (short)value == elt.GetInt16();
}
else if (valueType == typeof(int))
{
return elt.ValueKind == JsonValueKind.Number && (int)value == elt.GetInt32();
Expand All @@ -29,6 +37,22 @@ internal static bool HasValue(JsonElement elt, object value)
{
return elt.ValueKind == JsonValueKind.Number && (long)value == elt.GetInt64();
}
else if (valueType == typeof(byte))
{
return elt.ValueKind == JsonValueKind.Number && (byte)value == elt.GetByte();
}
else if (valueType == typeof(ushort))
{
return elt.ValueKind == JsonValueKind.Number && (ushort)value == elt.GetUInt16();
}
else if (valueType == typeof(uint))
{
return elt.ValueKind == JsonValueKind.Number && (uint)value == elt.GetUInt32();
}
else if (valueType == typeof(ulong))
{
return elt.ValueKind == JsonValueKind.Number && (ulong)value == elt.GetUInt64();
}
else if (valueType == typeof(float))
{
return elt.ValueKind == JsonValueKind.Number && (float)value == elt.GetSingle();
Expand Down
12 changes: 12 additions & 0 deletions dotnet/src/DTDLParser/generated/ContextCollection.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,8 @@ private static ContextHistory GetDtdlContextHistory()
context4_0.AddTermDefinition("asynchronous", new Dtmi("dtmi:dtdl:instance:CommandType:asynchronous;4"), isMergeableType: false);
context4_0.AddTermDefinition("boolean", new Dtmi("dtmi:dtdl:instance:Schema:boolean;4"), isMergeableType: false);
context4_0.AddTermDefinition("Boolean", new Dtmi("dtmi:dtdl:class:Boolean;4"), isMergeableType: false);
context4_0.AddTermDefinition("byte", new Dtmi("dtmi:dtdl:instance:Schema:byte;4"), isMergeableType: false);
context4_0.AddTermDefinition("Byte", new Dtmi("dtmi:dtdl:class:Byte;4"), isMergeableType: false);
context4_0.AddTermDefinition("bytes", new Dtmi("dtmi:dtdl:instance:Schema:bytes;4"), isMergeableType: false);
context4_0.AddTermDefinition("Bytes", new Dtmi("dtmi:dtdl:class:Bytes;4"), isMergeableType: false);
context4_0.AddTermDefinition("Command", new Dtmi("dtmi:dtdl:class:Command;4"), isMergeableType: false);
Expand Down Expand Up @@ -1498,6 +1500,8 @@ private static ContextHistory GetDtdlContextHistory()
context4_0.AddTermDefinition("schemas", new Dtmi("dtmi:dtdl:property:schemas;4"), isMergeableType: false);
context4_0.AddTermDefinition("SemanticType", new Dtmi("dtmi:dtdl:class:SemanticType;4"), isMergeableType: false);
context4_0.AddTermDefinition("SemanticUnit", new Dtmi("dtmi:dtdl:class:SemanticUnit;4"), isMergeableType: false);
context4_0.AddTermDefinition("short", new Dtmi("dtmi:dtdl:instance:Schema:short;4"), isMergeableType: false);
context4_0.AddTermDefinition("Short", new Dtmi("dtmi:dtdl:class:Short;4"), isMergeableType: false);
context4_0.AddTermDefinition("string", new Dtmi("dtmi:dtdl:instance:Schema:string;4"), isMergeableType: false);
context4_0.AddTermDefinition("String", new Dtmi("dtmi:dtdl:class:String;4"), isMergeableType: false);
context4_0.AddTermDefinition("symbol", new Dtmi("dtmi:dtdl:property:symbol;4"), isMergeableType: false);
Expand All @@ -1509,6 +1513,14 @@ private static ContextHistory GetDtdlContextHistory()
context4_0.AddTermDefinition("Time", new Dtmi("dtmi:dtdl:class:Time;4"), isMergeableType: false);
context4_0.AddTermDefinition("Unit", new Dtmi("dtmi:dtdl:class:Unit;4"), isMergeableType: false);
context4_0.AddTermDefinition("UnitAttribute", new Dtmi("dtmi:dtdl:class:UnitAttribute;4"), isMergeableType: false);
context4_0.AddTermDefinition("unsignedByte", new Dtmi("dtmi:dtdl:instance:Schema:unsignedByte;4"), isMergeableType: false);
context4_0.AddTermDefinition("UnsignedByte", new Dtmi("dtmi:dtdl:class:UnsignedByte;4"), isMergeableType: false);
context4_0.AddTermDefinition("unsignedInteger", new Dtmi("dtmi:dtdl:instance:Schema:unsignedInteger;4"), isMergeableType: false);
context4_0.AddTermDefinition("UnsignedInteger", new Dtmi("dtmi:dtdl:class:UnsignedInteger;4"), isMergeableType: false);
context4_0.AddTermDefinition("unsignedLong", new Dtmi("dtmi:dtdl:instance:Schema:unsignedLong;4"), isMergeableType: false);
context4_0.AddTermDefinition("UnsignedLong", new Dtmi("dtmi:dtdl:class:UnsignedLong;4"), isMergeableType: false);
context4_0.AddTermDefinition("unsignedShort", new Dtmi("dtmi:dtdl:instance:Schema:unsignedShort;4"), isMergeableType: false);
context4_0.AddTermDefinition("UnsignedShort", new Dtmi("dtmi:dtdl:class:UnsignedShort;4"), isMergeableType: false);
context4_0.AddTermDefinition("uuid", new Dtmi("dtmi:dtdl:instance:Schema:uuid;4"), isMergeableType: false);
context4_0.AddTermDefinition("Uuid", new Dtmi("dtmi:dtdl:class:Uuid;4"), isMergeableType: false);
context4_0.AddTermDefinition("valueSchema", new Dtmi("dtmi:dtdl:property:valueSchema;4"), isMergeableType: false);
Expand Down
Loading

0 comments on commit 16fa4a9

Please sign in to comment.