feat(runtime): decode IsArray/ArrayLength byte-parity in DeploymentArtifact
This commit is contained in:
@@ -438,6 +438,7 @@ public static class DeploymentArtifact
|
||||
if (!equipmentNamespaces.Contains(nsId)) continue;
|
||||
|
||||
var (isHistorized, historianTagname) = ExtractTagHistorize(tagConfig);
|
||||
var (isArray, arrayLength) = ExtractTagArray(tagConfig);
|
||||
result.Add(new EquipmentTagPlan(
|
||||
TagId: tagId!,
|
||||
EquipmentId: equipmentId!,
|
||||
@@ -449,7 +450,9 @@ public static class DeploymentArtifact
|
||||
Writable: writable,
|
||||
Alarm: ExtractTagAlarm(tagConfig),
|
||||
IsHistorized: isHistorized,
|
||||
HistorianTagname: historianTagname));
|
||||
HistorianTagname: historianTagname,
|
||||
IsArray: isArray,
|
||||
ArrayLength: arrayLength));
|
||||
}
|
||||
|
||||
result.Sort((a, b) =>
|
||||
@@ -719,6 +722,35 @@ public static class DeploymentArtifact
|
||||
catch (JsonException) { return (false, null); }
|
||||
}
|
||||
|
||||
/// <summary>Parses the optional array intent from a tag's <c>TagConfig</c> JSON: the <c>isArray</c>
|
||||
/// bool (absent / not a bool / non-object root / blank / malformed ⇒ <c>false</c>) and the optional
|
||||
/// <c>arrayLength</c> uint (honoured ONLY when <c>isArray</c> is true AND the prop is a JSON number
|
||||
/// that fits <c>uint</c>; else <c>null</c>). Mirrors <see cref="ExtractTagHistorize"/> in structure +
|
||||
/// null/blank/non-object/malformed-JSON tolerance. Never throws. The live-edit composer side
|
||||
/// (<c>Phase7Composer.ExtractTagArray</c>) MUST parse identically (byte-parity).</summary>
|
||||
private static (bool IsArray, uint? ArrayLength) ExtractTagArray(string? tagConfig)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(tagConfig)) return (false, null);
|
||||
try
|
||||
{
|
||||
using var doc = JsonDocument.Parse(tagConfig);
|
||||
if (doc.RootElement.ValueKind != JsonValueKind.Object) return (false, null);
|
||||
var isArray = doc.RootElement.TryGetProperty("isArray", out var aEl)
|
||||
&& (aEl.ValueKind == JsonValueKind.True || aEl.ValueKind == JsonValueKind.False)
|
||||
&& aEl.GetBoolean();
|
||||
uint? arrayLength = null;
|
||||
if (isArray
|
||||
&& doc.RootElement.TryGetProperty("arrayLength", out var lEl)
|
||||
&& lEl.ValueKind == JsonValueKind.Number
|
||||
&& lEl.TryGetUInt32(out var len))
|
||||
{
|
||||
arrayLength = len;
|
||||
}
|
||||
return (isArray, arrayLength);
|
||||
}
|
||||
catch (JsonException) { return (false, null); }
|
||||
}
|
||||
|
||||
private static IReadOnlyList<T> ReadArray<T>(JsonElement root, string propertyName, Func<JsonElement, T?> reader)
|
||||
where T : class
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user