mirror of
https://codeberg.org/git-pages/git-pages.git
synced 2026-05-17 12:41:38 +00:00
82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
type BoundedReader struct {
|
|
inner io.Reader
|
|
fuel int64
|
|
err error
|
|
}
|
|
|
|
func ReadAtMost(reader io.Reader, count int64, err error) io.Reader {
|
|
return &BoundedReader{reader, count, err}
|
|
}
|
|
|
|
func (reader *BoundedReader) Read(dest []byte) (count int, err error) {
|
|
if reader.fuel <= 0 {
|
|
return 0, reader.err
|
|
}
|
|
if int64(len(dest)) > reader.fuel {
|
|
dest = dest[0:reader.fuel]
|
|
}
|
|
count, err = reader.inner.Read(dest)
|
|
reader.fuel -= int64(count)
|
|
return
|
|
}
|
|
|
|
type prettyError interface {
|
|
error
|
|
Pretty() string
|
|
}
|
|
|
|
func prettyErrMsg(err error) string {
|
|
switch cerr := err.(type) {
|
|
case prettyError:
|
|
return cerr.Pretty()
|
|
default:
|
|
return cerr.Error()
|
|
}
|
|
}
|
|
|
|
type prettyJoinError struct {
|
|
errs []error
|
|
}
|
|
|
|
func joinErrors(errs ...error) error {
|
|
if err := errors.Join(errs...); err != nil {
|
|
wrapErr := err.(interface{ Unwrap() []error })
|
|
return &prettyJoinError{errs: wrapErr.Unwrap()}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *prettyJoinError) Error() string {
|
|
var s strings.Builder
|
|
for i, err := range e.errs {
|
|
if i > 0 {
|
|
s.WriteString("; ")
|
|
}
|
|
s.WriteString(err.Error())
|
|
}
|
|
return s.String()
|
|
}
|
|
|
|
func (e *prettyJoinError) Pretty() string {
|
|
var s strings.Builder
|
|
for i, err := range e.errs {
|
|
if i > 0 {
|
|
s.WriteString("\n- ")
|
|
}
|
|
s.WriteString(strings.ReplaceAll(prettyErrMsg(err), "\n", "\n "))
|
|
}
|
|
return s.String()
|
|
}
|
|
|
|
func (e *prettyJoinError) Unwrap() []error {
|
|
return e.errs
|
|
}
|