about summary refs log blame commit diff stats
path: root/src/js/console.nim
blob: 755910a594770282aefae761807c7a5a067c17e5 (plain) (tree)
1
2
3
4
5
6
7
                   
                      
                          
                

                          
                 





                     
                                                                               







                                     

                                                  
                 








                                                    

                                                                            

                   


                         
                    



                        





                                         

                                                                             
                              
 

                                                                             
                              
 

                                                                            
                              
 

                                                                            
                              
 
                                        


                            
                                        






                                                                 



                                                    
import io/dynstream
import monoucha/fromjs
import monoucha/javascript
import types/opt

type Console* = ref object
  err*: DynStream
  clearFun: proc()
  showFun: proc()
  hideFun: proc()

jsDestructor(Console)

proc newConsole*(err: DynStream; clearFun: proc() = nil; showFun: proc() = nil;
    hideFun: proc() = nil): Console =
  return Console(
    err: err,
    clearFun: clearFun,
    showFun: showFun,
    hideFun: hideFun
  )

proc log*(console: Console; ss: varargs[string]) =
  var buf = ""
  for i, s in ss:
    buf &= s
    if i != ss.high:
      buf &= ' '
  buf &= '\n'
  console.err.write(buf)

proc error*(console: Console; ss: varargs[string]) =
  console.log(ss)

proc log*(ctx: JSContext; console: Console; ss: varargs[JSValue]): Opt[void]
    {.jsfunc.} =
  var buf = ""
  for i, val in ss:
    var res: string
    ?ctx.fromJS(val, res)
    buf &= res
    if i != ss.high:
      buf &= ' '
  buf &= '\n'
  console.err.write(buf)
  ok()

proc clear(console: Console) {.jsfunc.} =
  if console.clearFun != nil:
    console.clearFun()

# For now, these are the same as log().
proc debug(ctx: JSContext; console: Console; ss: varargs[JSValue]): Opt[void]
    {.jsfunc.} =
  return log(ctx, console, ss)

proc error(ctx: JSContext; console: Console; ss: varargs[JSValue]): Opt[void]
    {.jsfunc.} =
  return log(ctx, console, ss)

proc info(ctx: JSContext; console: Console; ss: varargs[JSValue]): Opt[void]
    {.jsfunc.} =
  return log(ctx, console, ss)

proc warn(ctx: JSContext; console: Console; ss: varargs[JSValue]): Opt[void]
    {.jsfunc.} =
  return log(ctx, console, ss)

proc show(console: Console) {.jsfunc.} =
  if console.showFun != nil:
    console.showFun()

proc hide(console: Console) {.jsfunc.} =
  if console.hideFun != nil:
    console.hideFun()

proc addConsoleModule*(ctx: JSContext) =
  #TODO console should not have a prototype
  # "For historical reasons, console is lowercased."
  ctx.registerType(Console, nointerface = true, name = "console")

proc writeException*(ctx: JSContext; s: DynStream) =
  s.write(ctx.getExceptionMsg())
  s.sflush()