File: limit_writer.go

package info (click to toggle)
gitlab-ci-multi-runner 14.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 31,248 kB
  • sloc: sh: 1,694; makefile: 384; asm: 79; ruby: 68
file content (41 lines) | stat: -rw-r--r-- 640 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package limitwriter

import (
	"errors"
	"io"
)

var ErrWriteLimitExceeded = errors.New("write limit exceeded")

type limitWriter struct {
	w       io.Writer
	limit   int64
	written int64
}

func New(w io.Writer, n int64) io.Writer {
	return &limitWriter{w: w, limit: n}
}

func (w *limitWriter) Write(p []byte) (n int, err error) {
	capacity := w.limit - w.written
	if capacity <= 0 {
		return 0, io.ErrShortWrite
	}

	if int64(len(p)) > capacity {
		n, err = w.w.Write(p[:capacity])
		if err == nil {
			err = ErrWriteLimitExceeded
		}
	} else {
		n, err = w.w.Write(p)
	}

	if n < 0 {
		n = 0
	}
	w.written += int64(n)

	return n, err
}