about summary refs log tree commit diff stats
path: root/src/io/teestream.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2022-12-10 19:05:38 +0100
committerbptato <nincsnevem662@gmail.com>2022-12-10 19:05:38 +0100
commit1e858c874804444bc4b95b6e89eb96a0deb8473c (patch)
tree3151b498e19c6d6eed3d90827483eb270314f3da /src/io/teestream.nim
parentd963385cd9fd77f0a950c5b92be7774bbf76d661 (diff)
downloadchawan-1e858c874804444bc4b95b6e89eb96a0deb8473c.tar.gz
Add support for the encoding standard, fix parseLegacyColor
Also, fix a bug in the
Diffstat (limited to 'src/io/teestream.nim')
-rw-r--r--src/io/teestream.nim44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/io/teestream.nim b/src/io/teestream.nim
new file mode 100644
index 00000000..81c9e2f0
--- /dev/null
+++ b/src/io/teestream.nim
@@ -0,0 +1,44 @@
+import streams
+
+type TeeStream = ref object of Stream
+  source: Stream
+  dest: Stream
+  closedest: bool
+
+proc tsClose(s: Stream) =
+  let s = cast[TeeStream](s)
+  s.source.close()
+  if s.closedest:
+    s.dest.close()
+
+proc tsReadData(s: Stream, buffer: pointer, bufLen: int): int =
+  let s = cast[TeeStream](s)
+  result = s.source.readData(buffer, bufLen)
+  s.dest.writeData(buffer, result)
+
+proc tsReadDataStr(s: Stream, buffer: var string, slice: Slice[int]): int =
+  let s = cast[TeeStream](s)
+  result = s.source.readDataStr(buffer, slice)
+  if result <= 0: return
+  s.dest.writeData(addr buffer[0], result)
+
+proc tsAtEnd(s: Stream): bool =
+  let s = cast[TeeStream](s)
+  return s.source.atEnd
+
+proc newTeeStream*(source, dest: Stream, closedest = true): TeeStream =
+  return TeeStream(
+    source: source,
+    dest: dest,
+    closedest: closedest,
+    closeImpl: tsClose,
+    readDataImpl:
+      cast[proc(s: Stream, buffer: pointer, len: int): int
+      {.nimcall, raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
+      ](tsReadData),
+    readDataStrImpl:
+      cast[proc(s: Stream, buffer: var string, slice: Slice[int]): int
+      {.nimcall, raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.}
+      ](tsReadDataStr),
+    atEndImpl: tsAtEnd
+  )