github.com/kamalshkeir/kencoding@v0.0.2-0.20230409043843-44b609a0475a/thrift/error.go (about)

     1  package thrift
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"strings"
     8  )
     9  
    10  type MissingField struct {
    11  	Field Field
    12  }
    13  
    14  func (e *MissingField) Error() string {
    15  	return fmt.Sprintf("missing required field: %s", e.Field)
    16  }
    17  
    18  type TypeMismatch struct {
    19  	Expect Type
    20  	Found  Type
    21  	item   string
    22  }
    23  
    24  func (e *TypeMismatch) Error() string {
    25  	return fmt.Sprintf("%s type mismatch: expected %s but found %s", e.item, e.Expect, e.Found)
    26  }
    27  
    28  type decodeError struct {
    29  	base error
    30  	path []error
    31  }
    32  
    33  func (e *decodeError) Error() string {
    34  	s := strings.Builder{}
    35  	s.Grow(256)
    36  	s.WriteString("decoding thrift payload: ")
    37  
    38  	if len(e.path) != 0 {
    39  		n := len(e.path) - 1
    40  		for i := n; i >= 0; i-- {
    41  			if i < n {
    42  				s.WriteString(" → ")
    43  			}
    44  			s.WriteString(e.path[i].Error())
    45  		}
    46  		s.WriteString(": ")
    47  	}
    48  
    49  	s.WriteString(e.base.Error())
    50  	return s.String()
    51  }
    52  
    53  func (e *decodeError) Unwrap() error { return e.base }
    54  
    55  func with(base, elem error) error {
    56  	if errors.Is(base, io.EOF) {
    57  		return base
    58  	}
    59  	e, _ := base.(*decodeError)
    60  	if e == nil {
    61  		e = &decodeError{base: base}
    62  	}
    63  	e.path = append(e.path, elem)
    64  	return e
    65  }
    66  
    67  type decodeErrorField struct {
    68  	cause Field
    69  }
    70  
    71  func (d *decodeErrorField) Error() string {
    72  	return d.cause.String()
    73  }
    74  
    75  type decodeErrorList struct {
    76  	cause List
    77  	index int
    78  }
    79  
    80  func (d *decodeErrorList) Error() string {
    81  	return fmt.Sprintf("%d/%d:%s", d.index, d.cause.Size, d.cause)
    82  }
    83  
    84  type decodeErrorSet struct {
    85  	cause Set
    86  	index int
    87  }
    88  
    89  func (d *decodeErrorSet) Error() string {
    90  	return fmt.Sprintf("%d/%d:%s", d.index, d.cause.Size, d.cause)
    91  }
    92  
    93  type decodeErrorMap struct {
    94  	cause Map
    95  	index int
    96  }
    97  
    98  func (d *decodeErrorMap) Error() string {
    99  	return fmt.Sprintf("%d/%d:%s", d.index, d.cause.Size, d.cause)
   100  }
   101  
   102  func dontExpectEOF(err error) error {
   103  	switch err {
   104  	case nil:
   105  		return nil
   106  	case io.EOF:
   107  		return io.ErrUnexpectedEOF
   108  	default:
   109  		return err
   110  	}
   111  }