private void CopyToMatrixFlatArray()

in src/Azure.IIoT.OpcUa/src/Encoders/JsonDecoderEx.cs [1664:1771]


        private void CopyToMatrixFlatArray(JArray array, Array target, ref int index,
            BuiltInType type)
        {
            foreach (var item in array)
            {
                if (item is JArray next)
                {
                    // Recurse into inner array until we hit individual items
                    CopyToMatrixFlatArray(next, target, ref index, type);
                }
                else if (index < target.GetLength(0))
                {
                    // Read item at top of stack
                    _stack.Push(item);
                    switch (type)
                    {
                        case BuiltInType.Boolean:
                            target.SetValue(ReadBoolean(null), index++);
                            break;
                        case BuiltInType.SByte:
                            target.SetValue(ReadSByte(null), index++);
                            break;
                        case BuiltInType.Byte:
                            target.SetValue(ReadByte(null), index++);
                            break;
                        case BuiltInType.Int16:
                            target.SetValue(ReadInt16(null), index++);
                            break;
                        case BuiltInType.UInt16:
                            target.SetValue(ReadUInt16(null), index++);
                            break;
                        case BuiltInType.Enumeration:
                        case BuiltInType.Int32:
                            target.SetValue(ReadInt32(null), index++);
                            break;
                        case BuiltInType.UInt32:
                            target.SetValue(ReadUInt32(null), index++);
                            break;
                        case BuiltInType.Int64:
                            target.SetValue(ReadInt64(null), index++);
                            break;
                        case BuiltInType.UInt64:
                            target.SetValue(ReadUInt64(null), index++);
                            break;
                        case BuiltInType.Float:
                            target.SetValue(ReadFloat(null), index++);
                            break;
                        case BuiltInType.Double:
                            target.SetValue(ReadDouble(null), index++);
                            break;
                        case BuiltInType.String:
                            target.SetValue(ReadString(null), index++);
                            break;
                        case BuiltInType.ByteString:
                            target.SetValue(ReadByteString(null), index++);
                            break;
                        case BuiltInType.DateTime:
                            target.SetValue(ReadDateTime(null), index++);
                            break;
                        case BuiltInType.Guid:
                            target.SetValue(ReadGuid(null), index++);
                            break;
                        case BuiltInType.NodeId:
                            target.SetValue(ReadNodeId(null), index++);
                            break;
                        case BuiltInType.ExpandedNodeId:
                            target.SetValue(ReadExpandedNodeId(null), index++);
                            break;
                        case BuiltInType.QualifiedName:
                            target.SetValue(ReadQualifiedName(null), index++);
                            break;
                        case BuiltInType.LocalizedText:
                            target.SetValue(ReadLocalizedText(null), index++);
                            break;
                        case BuiltInType.StatusCode:
                            target.SetValue(ReadStatusCode(null), index++);
                            break;
                        case BuiltInType.XmlElement:
                            target.SetValue(ReadXmlElement(null), index++);
                            break;
                        case BuiltInType.ExtensionObject:
                            target.SetValue(ReadExtensionObject(null), index++);
                            break;
                        case BuiltInType.UInteger:
                            target.SetValue(ReadUInteger(null), index++);
                            break;
                        case BuiltInType.Integer:
                            target.SetValue(ReadInteger(null), index++);
                            break;
                        case BuiltInType.Number:
                            target.SetValue(ReadNumber(null), index++);
                            break;
                        case BuiltInType.Variant:
                            target.SetValue(ReadVariant(null), index++);
                            break;
                        default:
                            target.SetValue(null, index++);
                            break;
                    }
                    _stack.Pop();
                }
                else
                {
                    throw new DecodingException(
                        "Read matrix is larger than array dimensions.");
                }
            }
        }