shad-go/wasm/flappygopher/console/console.go
2023-04-28 00:43:03 +04:00

172 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package console provides wrapper to javascript console.
//
// Some functions support format specifiers. The following specifiers
// are supported:
//
// %s Formats the value as a string
// %d Formats the value as an integer
// %i Same as %d
// %f Formats the value as a floating point value.
// %o Formats the value as an expandable DOM element (as in the Elements panel).
// %O Formats the value as an expandable JavaScript object.
// %c Formats the output string according to CSS styles you provide.
//
// This package does not provide functions for the aliases
// console.debug and console.info use Log instead.
//
// For a more detailed explanation of the APIs, see for example
// Google's documentation at
// https://developers.google.com/chrome-developer-tools/docs/console-api.
//
// Portions of this documentation are modifications based on work
// created and shared by Google and used according to terms described
// in the Creative Commons 3.0 Attribution License.
package console
import (
"bytes"
"syscall/js"
)
var c = js.Global().Get("console")
// Assert writes msg to the console if b is false.
func Assert(b bool, msg interface{}) {
c.Call("assert", b, msg)
}
// Clear clears the console.
func Clear() {
c.Call("clear")
}
// Count writes the number of times that it has been invoked at the
// same line and with the same label.
func Count(label string) {
c.Call("count", label)
}
// Dir prints a JavaScript representation of the specified object. If
// the object being logged is an HTML element, then the properties of
// its DOM representation are displayed.
func Dir(obj interface{}) {
c.Call("dir", obj)
}
// DirXML Prints an XML representation of the specified object. For
// HTML elements, calling this method is equivalent to calling Log.
func DirXML(obj interface{}) {
c.Call("dirxml", obj)
}
// Error is like Log but also includes a stack trace.
func Error(objs ...interface{}) {
c.Call("error", objs...)
}
// Group starts a new logging group with an optional title.
//
// All console output that occurs after calling this function appears
// in the same visual group. Groups can be nested.
//
// The title will be generated according to the rules of the Log
// function.
func Group(objs ...interface{}) {
c.Call("group", objs...)
}
// GroupCollapsed is like Group, except that the newly created
// group starts collapsed instead of open.
func GroupCollapsed(objs ...interface{}) {
c.Call("groupCollapsed", objs...)
}
// GroupEnd closes the currently active logging group.
func GroupEnd() {
c.Call("groupEnd")
}
// Log displays a message in the console. You pass one or more objects
// to this method, each of which are evaluated and concatenated into a
// space-delimited string. The first parameter you pass to Log may
// contain format specifiers.
func Log(objs ...interface{}) {
c.Call("log", objs...)
}
// Profile starts a new CPU profile with an optional label.
func Profile(label interface{}) {
c.Call("profile", label)
}
// ProfileEnd stops the currently running CPU profile, if any.
func ProfileEnd() {
c.Call("profileEnd")
}
// Time starts a new timer with an associated label. Calling TimeEnd
// with the same label will stop the timer and print the elapsed time.
func Time(label interface{}) {
c.Call("time", label)
}
// TimeEnd ends a timer that was started with Time and prints the
// elapsed time.
func TimeEnd(label interface{}) {
c.Call("timeEnd", label)
}
// Timestamp adds an event to the timeline during a recording session.
func Timestamp(label interface{}) {
c.Call("timeStamp", label)
}
// Trace prints a stack trace, starting from the point where Trace was
// called.
func Trace() {
c.Call("trace")
}
// Warn is like Log but displays a different icon alongside the
// message.
func Warn(objs ...interface{}) {
c.Call("warn", objs...)
}
// Writer implements an io.Writer on top of the JavaScript console.
// Writes will be buffered until a newline is encountered, which will
// cause flushing up to the newline.
type Writer struct {
buf *bytes.Buffer
}
func (w *Writer) Write(buf []byte) (n int, err error) {
if len(buf) == 0 {
return 0, nil
}
for i := len(buf); i >= 0; i-- {
if buf[i] == '\n' {
w.buf.Write(buf[:i])
Log(w.buf.String())
w.buf.Reset()
w.buf.Write(buf[i+1:])
break
}
}
return len(buf), nil
}
func (w *Writer) WriteString(s string) (n int, err error) {
return w.Write([]byte(s))
}
// Flush will flush the current line to the console.
func (w *Writer) Flush() {
w.Write([]byte{'\n'})
}
func New() *Writer {
return &Writer{buf: new(bytes.Buffer)}
}