()
| 125 | } |
| 126 | |
| 127 | func (m *metaReader) nextFrame() (any, error) { |
| 128 | r := m.reader |
| 129 | pos := r.pos |
| 130 | version, err := r.ReadByte() |
| 131 | if err != nil { |
| 132 | return nil, noEOF(err) |
| 133 | } |
| 134 | if version == 0xff { |
| 135 | return &Frame{Type: "EOS", Offset: pos}, nil |
| 136 | |
| 137 | } |
| 138 | if err := bsupio.CheckVersion(version); err != nil { |
| 139 | return nil, err |
| 140 | } |
| 141 | code, err := r.ReadByte() |
| 142 | if err != nil { |
| 143 | return nil, noEOF(err) |
| 144 | } |
| 145 | |
| 146 | var block any |
| 147 | if (code & 0x40) != 0 { |
| 148 | block, err = r.readComp(code) |
| 149 | if err != nil { |
| 150 | return nil, noEOF(err) |
| 151 | } |
| 152 | } else { |
| 153 | block, err = r.readUncomp(code) |
| 154 | if err != nil { |
| 155 | return nil, noEOF(err) |
| 156 | } |
| 157 | } |
| 158 | switch typ := (code >> 4) & 3; typ { |
| 159 | case 0: |
| 160 | return &Frame{Type: "types", Offset: pos, Block: block}, nil |
| 161 | case 1: |
| 162 | return &Frame{Type: "values", Offset: pos, Block: block}, nil |
| 163 | case 2: |
| 164 | return &Frame{Type: "control", Offset: pos, Block: block}, nil |
| 165 | default: |
| 166 | return nil, fmt.Errorf("encountered bad frame type: %d", typ) |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | type reader struct { |
| 171 | reader *bufio.Reader |
no test coverage detected