static bool TryReadSectionInfo()

in src/AmqpMessageReader.cs [218:273]


        static bool TryReadSectionInfo(ByteBuffer buffer, out SectionInfo info, out Error error)
        {
            info = default(SectionInfo);

            FormatCode formatCode = AmqpEncoding.ReadFormatCode(buffer);
            if (formatCode != FormatCode.Described)
            {
                error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidFormatCode, formatCode, buffer.Offset - FixedWidth.FormatCode));
                return false;
            }

            ulong code = ulong.MaxValue;
            formatCode = AmqpEncoding.ReadFormatCode(buffer);
            switch (formatCode)
            {
                case FormatCode.SmallULong:
                    code = AmqpBitConverter.ReadUByte(buffer);
                    break;
                case FormatCode.ULong:
                    code = AmqpBitConverter.ReadULong(buffer);
                    break;
                case FormatCode.Symbol32:
                case FormatCode.Symbol8:
                    // symbol name should be seldom used so do not optimize for it
                    AmqpSymbol name = SymbolEncoding.Decode(buffer, formatCode);
                    for (int i = 0; i < MessageSections.Length; i++)
                    {
                        if (MessageSections[i].Name.Equals(name.Value))
                        {
                            code = MessageSections[i].Code;
                            break;
                        }
                    }
                    if (code == ulong.MaxValue)
                    {
                        error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidMessageSectionCode, name));
                        return false;
                    }
                    break;
                default:
                    error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidFormatCode, formatCode, buffer.Offset - FixedWidth.FormatCode));
                    return false;
            }

            int index = (int)(code - MessageSections[0].Code);
            if (index < 0 || index >= MessageSections.Length)
            {
                error = GetDecodeError(AmqpResources.GetString(Resources.AmqpInvalidMessageSectionCode, code));
                return false;
            }

            info = MessageSections[index];
            error = null;

            return true;
        }