func decodeContainer()

in AWSIoTFreeRTOSOTATests/Support/SwiftCBOR/Decoder/UnkeyedDecodingContainer.swift [140:246]


    func decodeContainer() throws -> CBORDecodingContainer {
        try checkCanDecodeValue()
        defer { self.currentIndex += 1 }

        let startIndex = self.index

        let length: Int
        let format = try self.readByte()

        switch format {
        // Integers
        // Small positive and negative integers
        case 0x00...0x17, 0x20...0x37:
            length = 0
        // UInt8 in following byte
        case 0x18, 0x38:
            length = 1
        // UInt16 in following bytes
        case 0x19, 0x39:
            length = 2
        // UInt32 in following bytes
        case 0x1a, 0x3a:
            length = 4
        // UInt64 in following bytes
        case 0x1b, 0x3b:
            length = 8
        // Byte strings
        case 0x40...0x57:
            length = try CBORDecoder(input: [0]).readLength(format, base: 0x40)
        case 0x58:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x40) + 1
        case 0x59:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x40) + 2
        case 0x5a:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x40) + 4
        case 0x5b:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x40) + 8
        // Terminated by break
        case 0x5f:
            // TODO: Is this ever going to get hit?
            throw DecodingError.dataCorruptedError(in: self, debugDescription: "Handling byte strings with break bytes is not supported yet")
        // UTF8 strings
        case 0x60...0x77:
            length = try CBORDecoder(input: [0]).readLength(format, base: 0x60)
        case 0x78:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x60) + 1
        case 0x79:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x60) + 2
        case 0x7a:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x60) + 4
        case 0x7b:
            let remainingData = self.data.suffix(from: startIndex.advanced(by: 1)).map { $0 }
            length = try CBORDecoder(input: remainingData).readLength(format, base: 0x60) + 8
        // Terminated by break
        case 0x7f:
            #warning("FIXME")
            throw DecodingError.dataCorruptedError(in: self, debugDescription: "Handling UTF8 strings with break bytes is not supported yet")
        // Arrays
        case 0x80...0x9f:
            let container = _CBORDecoder.UnkeyedContainer(data: self.data.suffix(from: startIndex), codingPath: self.nestedCodingPath, userInfo: self.userInfo)
            _ = container.nestedContainers

            self.index = container.index
            return container
        // Maps
        case 0xa0...0xbf:
            let container = _CBORDecoder.KeyedContainer<AnyCodingKey>(data: self.data.suffix(from: startIndex), codingPath: self.nestedCodingPath, userInfo: self.userInfo)
            _ = container.nestedContainers // FIXME

            self.index = container.index
            return container
        case 0xc0...0xdb:
//            let tag = try CBORDecoder(input: [0]).readVarUInt(format, base: 0xc0)
//            guard let item = try decodeItem() else { throw CBORError.unfinishedSequence }
//            return CBOR.tagged(CBOR.Tag(rawValue: tag), item)
            #warning("FIXME")
            throw DecodingError.dataCorruptedError(in: self, debugDescription: "Handling tags is not supported yet")
        case 0xe0...0xf3:
            length = 0
        case 0xf4, 0xf5, 0xf6, 0xf7, 0xf8:
            length = 0
        case 0xf9:
            length = 2
        case 0xfa:
            length = 4
        case 0xfb:
            length = 8
        case 0xff:
            length = 0
        default:
            throw DecodingError.dataCorruptedError(in: self, debugDescription: "Invalid format: \(format)")
        }

        let range: Range<Data.Index> = startIndex..<self.index.advanced(by: length)
        self.index = range.upperBound

        let container = _CBORDecoder.SingleValueContainer(data: self.data.subdata(in: range), codingPath: self.codingPath, userInfo: self.userInfo)

        return container
    }