/ src / util.go
util.go
 1  package git_pages
 2  
 3  import (
 4  	"errors"
 5  	"io"
 6  	"strings"
 7  )
 8  
 9  type BoundedReader struct {
10  	inner io.Reader
11  	fuel  int64
12  	err   error
13  }
14  
15  func ReadAtMost(reader io.Reader, count int64, err error) io.Reader {
16  	return &BoundedReader{reader, count, err}
17  }
18  
19  func (reader *BoundedReader) Read(dest []byte) (count int, err error) {
20  	if reader.fuel <= 0 {
21  		return 0, reader.err
22  	}
23  	if int64(len(dest)) > reader.fuel {
24  		dest = dest[0:reader.fuel]
25  	}
26  	count, err = reader.inner.Read(dest)
27  	reader.fuel -= int64(count)
28  	return
29  }
30  
31  type prettyError interface {
32  	error
33  	Pretty() string
34  }
35  
36  func prettyErrMsg(err error) string {
37  	switch cerr := err.(type) {
38  	case prettyError:
39  		return cerr.Pretty()
40  	default:
41  		return cerr.Error()
42  	}
43  }
44  
45  type prettyJoinError struct {
46  	errs []error
47  }
48  
49  func joinErrors(errs ...error) error {
50  	if err := errors.Join(errs...); err != nil {
51  		wrapErr := err.(interface{ Unwrap() []error })
52  		return &prettyJoinError{errs: wrapErr.Unwrap()}
53  	}
54  	return nil
55  }
56  
57  func (e *prettyJoinError) Error() string {
58  	var s strings.Builder
59  	for i, err := range e.errs {
60  		if i > 0 {
61  			s.WriteString("; ")
62  		}
63  		s.WriteString(err.Error())
64  	}
65  	return s.String()
66  }
67  
68  func (e *prettyJoinError) Pretty() string {
69  	var s strings.Builder
70  	for i, err := range e.errs {
71  		if i > 0 {
72  			s.WriteString("\n- ")
73  		}
74  		s.WriteString(strings.ReplaceAll(prettyErrMsg(err), "\n", "\n  "))
75  	}
76  	return s.String()
77  }
78  
79  func (e *prettyJoinError) Unwrap() []error {
80  	return e.errs
81  }
82  
83  func getMediaType(mimeType string) (mediaType string) {
84  	mediaType, _, _ = strings.Cut(mimeType, ";")
85  	mediaType = strings.TrimSpace(strings.ToLower(mediaType))
86  	return
87  }