diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-09-15 12:17:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-15 12:17:12 +0200 |
commit | 3b4ad9a81d7c2d194f4d3f2686d47d78857b65d7 (patch) | |
tree | fc635fda5032a7054f562025b4152ac54ba20f85 /pkg/channel | |
parent | d5db2af340b94b9900cf194e35d57af40a695fe1 (diff) | |
parent | 146c68f3acdc01f393a6cfadf9bc98eec3e8de94 (diff) | |
download | podman-3b4ad9a81d7c2d194f4d3f2686d47d78857b65d7.tar.gz podman-3b4ad9a81d7c2d194f4d3f2686d47d78857b65d7.tar.bz2 podman-3b4ad9a81d7c2d194f4d3f2686d47d78857b65d7.zip |
Merge pull request #7452 from jwhonce/issues/7136
Refactor API build endpoint to be more compliant
Diffstat (limited to 'pkg/channel')
-rw-r--r-- | pkg/channel/doc.go | 17 | ||||
-rw-r--r-- | pkg/channel/writer.go | 53 |
2 files changed, 70 insertions, 0 deletions
diff --git a/pkg/channel/doc.go b/pkg/channel/doc.go new file mode 100644 index 000000000..656fbddaa --- /dev/null +++ b/pkg/channel/doc.go @@ -0,0 +1,17 @@ +/* +Package channel provides helper structs/methods/funcs for working with channels + +Proxy from an io.Writer to a channel: + + w := channel.NewWriter(make(chan []byte, 10)) + go func() { + w.Write([]byte("Hello, World")) + }() + + fmt.Println(string(<-w.Chan())) + w.Close() + +Use of the constructor is required to initialize the channel. +Provide a channel of sufficient size to handle messages from writer(s). +*/ +package channel diff --git a/pkg/channel/writer.go b/pkg/channel/writer.go new file mode 100644 index 000000000..dbb38e416 --- /dev/null +++ b/pkg/channel/writer.go @@ -0,0 +1,53 @@ +package channel + +import ( + "io" + "sync" + + "github.com/pkg/errors" +) + +// WriteCloser is an io.WriteCloser that that proxies Write() calls to a channel +// The []byte buffer of the Write() is queued on the channel as one message. +type WriteCloser interface { + io.WriteCloser + Chan() <-chan []byte +} + +type writeCloser struct { + ch chan []byte + mux sync.Mutex +} + +// NewWriter initializes a new channel writer +func NewWriter(c chan []byte) WriteCloser { + return &writeCloser{ + ch: c, + } +} + +// Chan returns the R/O channel behind WriteCloser +func (w *writeCloser) Chan() <-chan []byte { + return w.ch +} + +// Write method for WriteCloser +func (w *writeCloser) Write(b []byte) (int, error) { + if w == nil || w.ch == nil { + return 0, errors.New("use channel.NewWriter() to initialize a WriteCloser") + } + + w.mux.Lock() + buf := make([]byte, len(b)) + copy(buf, b) + w.ch <- buf + w.mux.Unlock() + + return len(b), nil +} + +// Close method for WriteCloser +func (w *writeCloser) Close() error { + close(w.ch) + return nil +} |