func formatOneLine(v otto.Value, limit int, seen map[otto.Value]bool) (string, error) { if limit == 0 { return "...", nil } switch { case v.IsBoolean(), v.IsNull(), v.IsNumber(), v.IsUndefined(): return v.String(), nil case v.IsString(): return fmt.Sprintf("%q", v.String()), nil case v.IsFunction(): n, err := v.Object().Get("name") if err != nil { return "", err } if n.IsUndefined() { return "function", nil } return fmt.Sprintf("function %s", n.String()), nil case v.IsObject(): switch v.Class() { case "Array": return formatArrayOneLine(v, limit, seen) default: return formatObjectOneLine(v, limit, seen) } default: return "", fmt.Errorf("couldn't format type %s", v.Class()) } }
func inspect(v otto.Value, width, indent int) string { switch { case v.IsBoolean(), v.IsNull(), v.IsNumber(), v.IsString(), v.IsUndefined(), v.IsNaN(): return fmt.Sprintf("%s%q", strings.Repeat(" ", indent), v.String()) default: return "" } }
// Converts an Otto value to a Go value. Handles all JSON-compatible types. func ottoToGo(value otto.Value) (interface{}, error) { if value.IsBoolean() { return value.ToBoolean() } else if value.IsNull() || value.IsUndefined() { return nil, nil } else if value.IsNumber() { return value.ToFloat() } else if value.IsString() { return value.ToString() } else { switch value.Class() { case "Array": return ottoToGoArray(value.Object()) } } return nil, fmt.Errorf("Unsupported Otto value: %v", value) }
func (ctx ppctx) printValue(v otto.Value, level int, inArray bool) { switch { case v.IsObject(): ctx.printObject(v.Object(), level, inArray) case v.IsNull(): specialColor.Print("null") case v.IsUndefined(): specialColor.Print("undefined") case v.IsString(): s, _ := v.ToString() stringColor.Printf("%q", s) case v.IsBoolean(): b, _ := v.ToBoolean() specialColor.Printf("%t", b) case v.IsNaN(): numberColor.Printf("NaN") case v.IsNumber(): s, _ := v.ToString() numberColor.Printf("%s", s) default: fmt.Printf("<unprintable>") } }
func (s *Scripting) TriggerEvent(eventName string, rawArguments ...interface{}) (err error) { var ( present bool callbacks []otto.Value callback otto.Value response otto.Value arguments []interface{} ) if callbacks, present = s.listeners[eventName]; !present { return // Not an error to have no listeners. } if arguments, err = s.convertArguments(rawArguments); err != nil { return } for _, callback = range callbacks { if response, err = callback.Call(callback, arguments...); err != nil { return } if response.IsString() { fmt.Printf("Response from callback: %s\n", response.String()) } } return }
func formatIndent(v otto.Value, width, indent, limit, level, additional int, seen map[otto.Value]bool) (string, error) { if limit == 0 { return "...", nil } switch { case v.IsBoolean(), v.IsNull(), v.IsNumber(), v.IsUndefined(): return v.String(), nil case v.IsString(): return fmt.Sprintf("%q", v.String()), nil case v.IsFunction(): n, err := v.Object().Get("name") if err != nil { return "", err } if n.IsUndefined() { return "function", nil } return fmt.Sprintf("function %s", n.String()), nil case v.IsObject(): if d, err := formatOneLine(v, limit, seen); err != nil { return "", err } else if level*indent+additional+len(d) <= width { return d, nil } switch v.Class() { case "Array": return formatArray(v, width, indent, limit, level, seen) default: return formatObject(v, width, indent, limit, level, seen) } default: return "", fmt.Errorf("couldn't format type %s", v.Class()) } }