# Write data to streams. import options import sets import streams import tables import io/request import js/regex import types/blob import types/buffersource import types/formdata import types/url proc swrite*(stream: Stream, n: SomeNumber) proc sread*(stream: Stream, n: var SomeNumber) func slen*(n: SomeNumber): int proc swrite*[T](stream: Stream, s: set[T]) proc sread*[T](stream: Stream, s: var set[T]) func slen*[T](s: set[T]): int proc swrite*[T: enum](stream: Stream, x: T) proc sread*[T: enum](stream: Stream, x: var T) func slen*[T: enum](x: T): int proc swrite*(stream: Stream, s: string) proc sread*(stream: Stream, s: var string) func slen*(s: string): int proc swrite*(stream: Stream, b: bool) proc sread*(stream: Stream, b: var bool) func slen*(b: bool): int proc swrite*(stream: Stream, url: Url) proc sread*(stream: Stream, url: var Url) func slen*(url: Url): int proc swrite*(stream: Stream, tup: tuple) proc sread*(stream: Stream, tup: var tuple) func slen*(tup: tuple): int proc swrite*[T](stream: Stream, s: seq[T]) proc sread*[T](stream: Stream, s: var seq[T]) func slen*(s: seq): int proc swrite*[U, V](stream: Stream, t: Table[U, V]) proc sread*[U, V](stream: Stream, t: var Table[U, V]) func slen*[U, V](t: Table[U, V]): int proc swrite*(stream: Stream, obj: object) proc sread*(stream: Stream, obj: var object) func slen*(obj: object): int proc swrite*(stream: Stream, obj: ref object) proc sread*(stream: Stream, obj: var ref object) func slen*(obj: ref object): int proc swrite*(stream: Stream, part: FormDataEntry) proc sread*(stream: Stream, part: var FormDataEntry) func slen*(part: FormDataEntry): int proc swrite*(stream: Stream, blob: Blob) proc sread*(stream: Stream, blob: var Blob) func slen*(blob: Blob): int proc swrite*[T](stream: Stream, o: Option[T]) proc sread*[T](stream: Stream, o: var Option[T]) func slen*[T](o: Option[T]): int proc swrite*(stream: Stream, regex: Regex) proc sread*(stream: Stream, regex: var Regex) func slen*(regex: Regex): int proc swrite*(stream: Stream, source: BufferSource) proc sread*(stream: Stream, source: var BufferSource) func slen*(source: BufferSource): int proc swrite*(stream: Stream, n: SomeNumber) = stream.write(n) proc sread*(stream: Stream, n: var SomeNumber) = if stream.readData(addr n, sizeof(n)) < sizeof(n): raise newException(EOFError, "eof") func slen*(n: SomeNumber): int = return sizeof(n) proc swrite*[T: enum](stream: Stream, x: T) = stream.swrite(cast[int](x)) proc sread*[T: enum](stream: Stream, x: var T) = var i: int stream.sread(i) x = cast[T](i) func slen*[T: enum](x: T): int = return sizeof(int) proc swrite*[T](stream: Stream, s: set[T]) = stream.swrite(s.card) for e in s: stream.swrite(e) proc sread*[T](stream: Stream, s: var set[T]) = var len: int stream.sread(len) for i in 0 ..< len: var x: T stream.sread(x) s.incl(x) func slen*[T](s: set[T]): int = result = slen(s.card) for x in s: result += slen(x) proc swrite*(stream: Stream, s: string) = stream.swrite(s.len) stream.write(s) proc sread*(stream: Stream, s: var string) = var len: int stream.sread(len) if len > 0: s = newString(len) if stream.readData(addr s[0], len) < len: raise newException(EOFError, "eof") else: s = "" func slen*(s: string): int = slen(s.len) + s.len proc swrite*(stream: Stream, b: bool) = if b: stream.swrite(1u8) else: stream.swrite(0u8) proc sread*(stream: Stream, b: var bool) = var n: uint8 stream.sread(n) if n == 1u8: b = true else: assert n == 0u8 b = false func slen*(b: bool): int = return sizeof(uint8) proc swrite*(stream: Stream, url: URL) = if url != nil: stream.swrite(url.serialize()) else: stream.swrite("") proc sread*(stream: Stream, url: var URL) = var s: string stream.sread(s) if s == "": url = nil else: url = newURL(s) func slen*(url: URL): int = if url == nil: return slen("") return slen(url.serialize()) proc swrite*(stream: Stream, tup: tuple) = for f in tup.fields: stream.swrite(f) proc sread*(stream: Stream, tup: var tuple) = for f in tup.fields: stream.sread(f) func slen*(tup: tuple): int = for f in tup.fields: result += slen(f) proc swrite*[T](stream: Stream, s: seq[T]) = stream.swrite(s.len) var i = 0 for m in s: stream.swrite(m) inc i proc sread*[T](stream: Stream, s: var seq[T]) = var len: int stream.sread(len) s.setLen(len) for i in 0..