Skip to content

Commit

Permalink
Merge pull request #15 from bodgit/fill
Browse files Browse the repository at this point in the history
Add FillReader and DevZero implementations
  • Loading branch information
bodgit authored Nov 18, 2022
2 parents 469156c + 694635d commit 6768b02
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 3 deletions.
21 changes: 21 additions & 0 deletions fill.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package plumbing

import "io"

type fillReader struct {
b byte
}

func (r *fillReader) Read(p []byte) (int, error) {
for i := range p {
p[i] = r.b
}

return len(p), nil
}

// FillReader returns an io.Reader such that Read calls return an unlimited
// stream of b bytes.
func FillReader(b byte) io.Reader {
return &fillReader{b}
}
4 changes: 1 addition & 3 deletions padded.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package plumbing

import (
"bytes"
"io"
)

// PaddedReader returns an io.Reader that reads at most n bytes from r. If
// fewer than n bytes are available from r then any remaining bytes return
// fill instead.
func PaddedReader(r io.Reader, n int64, fill byte) io.Reader {
// Naive, but works
return io.LimitReader(io.MultiReader(r, bytes.NewBuffer(bytes.Repeat([]byte{fill}, int(n)))), n)
return io.LimitReader(io.MultiReader(r, FillReader(fill)), n)
}
18 changes: 18 additions & 0 deletions zero.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package plumbing

import "io"

type devZero struct {
io.Reader
}

func (w *devZero) Write(p []byte) (int, error) {
return len(p), nil
}

// DevZero returns an io.ReadWriter that behaves like /dev/zero such that Read
// calls return an unlimited stream of zero bytes and all Write calls succeed
// without doing anything.
func DevZero() io.ReadWriter {
return &devZero{FillReader(0)}
}
36 changes: 36 additions & 0 deletions zero_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package plumbing_test

import (
"bytes"
"io"
"testing"

"github.com/bodgit/plumbing"
"github.com/stretchr/testify/assert"
)

const limit = 10

func TestDevZero(t *testing.T) {
t.Parallel()

rw := plumbing.DevZero()
b := new(bytes.Buffer)

n, err := io.Copy(b, io.LimitReader(rw, limit))
if err != nil {
t.Fatal(err)
}

assert.Equal(t, limit, int(n))
assert.Equal(t, limit, b.Len())
assert.Equal(t, bytes.Repeat([]byte{0x00}, limit), b.Bytes())

n, err = io.Copy(rw, b)
if err != nil {
t.Fatal(err)
}

assert.Equal(t, limit, int(n))
assert.Equal(t, 0, b.Len())
}

0 comments on commit 6768b02

Please sign in to comment.