aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2019-12-08 20:51:05 +0000
committerChristine Dodrill <me@christine.website>2019-12-08 20:51:24 +0000
commit4c3b0f2e50fb8707ec40c2a8f1c3e15dad0b5929 (patch)
treebc708597ea5598ad376658c088d0640cdda7666d
parent90f4a88b78557e8b5b113829685e9d34f6eff1a7 (diff)
downloadx-1.2.1.tar.xz
x-1.2.1.zip
writersv1.2.1
-rw-r--r--writer/linesplitwriter.go29
-rw-r--r--writer/prefixwriter.go32
2 files changed, 61 insertions, 0 deletions
diff --git a/writer/linesplitwriter.go b/writer/linesplitwriter.go
new file mode 100644
index 0000000..ebb90c4
--- /dev/null
+++ b/writer/linesplitwriter.go
@@ -0,0 +1,29 @@
+package writer
+
+import (
+ "bytes"
+ "io"
+)
+
+func LineSplitting(sink io.Writer) io.Writer {
+ return lineSplittingWriter{writer: sink}
+}
+
+type lineSplittingWriter struct {
+ writer io.Writer
+}
+
+func (lsw lineSplittingWriter) Write(p []byte) (int, error) {
+ for _, line := range bytes.Split(p, []byte("\n")) {
+ if len(line) == 0 {
+ continue
+ }
+
+ _, err := lsw.writer.Write(append(line, '\n'))
+ if err != nil {
+ return -1, err
+ }
+ }
+
+ return len(p), nil
+}
diff --git a/writer/prefixwriter.go b/writer/prefixwriter.go
new file mode 100644
index 0000000..c019c3a
--- /dev/null
+++ b/writer/prefixwriter.go
@@ -0,0 +1,32 @@
+package writer
+
+import "io"
+
+type prefixingWriter struct {
+ prefix []byte
+ writer io.Writer
+}
+
+func (pw *prefixingWriter) Write(p []byte) (int, error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
+
+ // Perform an "atomic" write of a prefix and p to make sure that it doesn't interleave
+ // sub-line when used concurrently with io.PipeWrite.
+ n, err := pw.writer.Write(append(pw.prefix, p...))
+ if n > len(p) {
+ // To comply with the io.Writer interface requirements we must
+ // return a number of bytes written from p (0 <= n <= len(p)),
+ // so we are ignoring the length of the prefix here.
+ return len(p), err
+ }
+ return n, err
+}
+
+func PrefixWriter(prefix string, sink io.Writer) io.Writer {
+ return &prefixingWriter{
+ prefix: []byte(prefix),
+ writer: sink,
+ }
+}