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 a JS string or array into a Go string array. func ottoValueToStringArray(value otto.Value) []string { nativeValue, _ := value.Export() result := base.ValueToStringArray(nativeValue) if result == nil && !value.IsNull() && !value.IsUndefined() { base.Warn("SyncRunner: Non-string, non-array passed to JS callback: %s", value) } return result }
// 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 buildIteratorFromValue(val otto.Value, ts graph.TripleStore) graph.Iterator { if val.IsNull() || val.IsUndefined() { return ts.GetNodesAllIterator() } if val.IsPrimitive() { thing, _ := val.Export() switch v := thing.(type) { case string: it := ts.MakeFixed() it.AddValue(ts.GetIdFor(v)) return it default: glog.Errorln("Trying to build unknown primitive value.") } } switch val.Class() { case "Object": return buildIteratorTree(val.Object(), ts) case "Array": // Had better be an array of strings strings := makeListOfStringsFromArrayValue(val.Object()) it := ts.MakeFixed() for _, x := range strings { it.AddValue(ts.GetIdFor(x)) } return it case "Number": fallthrough case "Boolean": fallthrough case "Date": fallthrough case "String": it := ts.MakeFixed() str, _ := val.ToString() it.AddValue(ts.GetIdFor(str)) return it default: glog.Errorln("Trying to handle unsupported Javascript value.") return graph.NewNullIterator() } }
func buildIteratorFromValue(val otto.Value, qs graph.QuadStore) graph.Iterator { if val.IsNull() || val.IsUndefined() { return qs.NodesAllIterator() } if val.IsPrimitive() { thing, _ := val.Export() switch v := thing.(type) { case string: it := qs.FixedIterator() it.Add(qs.ValueOf(v)) return it default: glog.Errorln("Trying to build unknown primitive value.") } } switch val.Class() { case "Object": return buildIteratorTree(val.Object(), qs) case "Array": // Had better be an array of strings strings := stringsFrom(val.Object()) it := qs.FixedIterator() for _, x := range strings { it.Add(qs.ValueOf(x)) } return it case "Number": fallthrough case "Boolean": fallthrough case "Date": fallthrough case "String": it := qs.FixedIterator() it.Add(qs.ValueOf(val.String())) return it default: glog.Errorln("Trying to handle unsupported Javascript value.") return iterator.NewNull() } }
// Converts a JS string or array into a Go string array. func ottoValueToStringArray(value otto.Value) []string { nativeValue, _ := value.Export() switch nativeValue := nativeValue.(type) { case string: return []string{nativeValue} case []string: return nativeValue case []interface{}: result := make([]string, 0, len(nativeValue)) for _, item := range nativeValue { if str, ok := item.(string); ok { result = append(result, str) } } return result default: if !value.IsNull() && !value.IsUndefined() { base.Warn("SyncRunner: Non-string, non-array passed to JS callback: %s", value) } return nil } }
func buildPathFromValue(val otto.Value) (out []interface{}) { if val.IsNull() || val.IsUndefined() { return nil } if val.IsPrimitive() { thing, _ := val.Export() switch v := thing.(type) { case string: out = append(out, v) return default: clog.Errorf("Trying to build unknown primitive value.") } } switch val.Class() { case "Object": out = append(out, buildPathFromObject(val.Object())) return case "Array": // Had better be an array of strings for _, x := range stringsFrom(val.Object()) { out = append(out, x) } return case "Number": fallthrough case "Boolean": fallthrough case "Date": fallthrough case "String": out = append(out, val.String()) return default: clog.Errorf("Trying to handle unsupported Javascript value.") return nil } }
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 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()) } }