{.used.}

import
  typetraits, ../faststreams

proc writeNimRepr*(stream: OutputStream, str: string) =
  stream.write '"'

  for c in str:
    if c == '"':
      stream.write ['\'', '"']
    else:
      stream.write c

  stream.write '"'

proc writeNimRepr*(stream: OutputStream, x: char) =
  stream.write ['\'', x, '\'']

proc writeNimRepr*(stream: OutputStream, x: int) =
  stream.write $x # Making this more optimal has been left
                   # as an exercise for the reader

proc writeNimRepr*[T](stream: OutputStream, obj: T) =
  stream.write typetraits.name(T)
  stream.write '('

  var firstField = true
  for name, val in fieldPairs(obj):
    if not firstField:
      stream.write ", "

    stream.write name
    stream.write ": "
    stream.writeNimRepr val

    firstField = false

  stream.write ')'

type
  ABC = object
    a: int
    b: char
    c: string

block:
  var stream = memoryOutput()
  stream.writeNimRepr(ABC(a: 1, b: 'b', c: "str"))
  var repr = stream.getOutput(string)

  doAssert repr == "ABC(a: 1, b: 'b', c: \"str\")"