| Abhay Kumar | 40252eb | 2025-10-13 13:25:53 +0000 | [diff] [blame^] | 1 | package lz4 |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "fmt" |
| 6 | "io" |
| 7 | |
| 8 | "github.com/pierrec/lz4/v4/internal/lz4errors" |
| 9 | ) |
| 10 | |
| 11 | //go:generate go run golang.org/x/tools/cmd/stringer -type=aState -output state_gen.go |
| 12 | |
| 13 | const ( |
| 14 | noState aState = iota // uninitialized reader |
| 15 | errorState // unrecoverable error encountered |
| 16 | newState // instantiated object |
| 17 | readState // reading data |
| 18 | writeState // writing data |
| 19 | closedState // all done |
| 20 | ) |
| 21 | |
| 22 | type ( |
| 23 | aState uint8 |
| 24 | _State struct { |
| 25 | states []aState |
| 26 | state aState |
| 27 | err error |
| 28 | } |
| 29 | ) |
| 30 | |
| 31 | func (s *_State) init(states []aState) { |
| 32 | s.states = states |
| 33 | s.state = states[0] |
| 34 | } |
| 35 | |
| 36 | func (s *_State) reset() { |
| 37 | s.state = s.states[0] |
| 38 | s.err = nil |
| 39 | } |
| 40 | |
| 41 | // next sets the state to the next one unless it is passed a non nil error. |
| 42 | // It returns whether or not it is in error. |
| 43 | func (s *_State) next(err error) bool { |
| 44 | if err != nil { |
| 45 | s.err = fmt.Errorf("%s: %w", s.state, err) |
| 46 | s.state = errorState |
| 47 | return true |
| 48 | } |
| 49 | s.state = s.states[s.state] |
| 50 | return false |
| 51 | } |
| 52 | |
| 53 | // nextd is like next but for defers. |
| 54 | func (s *_State) nextd(errp *error) bool { |
| 55 | return errp != nil && s.next(*errp) |
| 56 | } |
| 57 | |
| 58 | // check sets s in error if not already in error and if the error is not nil or io.EOF, |
| 59 | func (s *_State) check(errp *error) { |
| 60 | if s.state == errorState || errp == nil { |
| 61 | return |
| 62 | } |
| 63 | if err := *errp; err != nil { |
| 64 | s.err = fmt.Errorf("%w[%s]", err, s.state) |
| 65 | if !errors.Is(err, io.EOF) { |
| 66 | s.state = errorState |
| 67 | } |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | func (s *_State) fail() error { |
| 72 | s.state = errorState |
| 73 | s.err = fmt.Errorf("%w[%s]", lz4errors.ErrInternalUnhandledState, s.state) |
| 74 | return s.err |
| 75 | } |