...

Source file src/github.com/pierrec/lz4/v4/state.go

Documentation: github.com/pierrec/lz4/v4

     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  }
    76  

View as plain text