]> Sergey Matveev's repositories - btrtrc.git/blob - bencode/scanner.go
Drop support for go 1.20
[btrtrc.git] / bencode / scanner.go
1 package bencode
2
3 import (
4         "errors"
5         "io"
6 )
7
8 // Implements io.ByteScanner over io.Reader, for use in Decoder, to ensure
9 // that as little as the undecoded input Reader is consumed as possible.
10 type scanner struct {
11         r      io.Reader
12         b      [1]byte // Buffer for ReadByte
13         unread bool    // True if b has been unread, and so should be returned next
14 }
15
16 func (me *scanner) Read(b []byte) (int, error) {
17         return me.r.Read(b)
18 }
19
20 func (me *scanner) ReadByte() (byte, error) {
21         if me.unread {
22                 me.unread = false
23                 return me.b[0], nil
24         }
25         n, err := me.r.Read(me.b[:])
26         if n == 1 {
27                 err = nil
28         }
29         return me.b[0], err
30 }
31
32 func (me *scanner) UnreadByte() error {
33         if me.unread {
34                 return errors.New("byte already unread")
35         }
36         me.unread = true
37         return nil
38 }