func toString(jv C.jv) string { // Dump it! dumped := C.jv_dump_string(jv, 0) defer C.jv_free(dumped) // Convert dump to string! strval := C.jv_string_value(dumped) return C.GoString(strval) }
func dumpObject(buf *bytes.Buffer, x C.jv) { keys := C.jv_keys(C.jv_copy(x)) defer C.jv_free(keys) ct := C.jv_array_length(C.jv_copy(keys)) buf.WriteRune('{') defer buf.WriteRune('}') for i := C.int(0); i < ct; i++ { key := C.jv_array_get(C.jv_copy(keys), i) if i > 0 { buf.WriteRune(',') } dumpString(buf, key) buf.WriteRune(':') val := C.jv_object_get(C.jv_copy(x), key) dumpValue(buf, val) C.jv_free(val) } }
// GetInvalidMessageAsString gets the error message for this Jv. If there is none it // will return ("", false). Otherwise it will return the message as a string and true, // converting non-string values if necessary. If you want the message in it's // native Jv type use `GetInvalidMessage()` // // Consumes the invocant. func (jv *Jv) GetInvalidMessageAsString() (string, bool) { msg := C.jv_invalid_get_msg(jv.jv) defer C.jv_free(msg) if C.jv_get_kind(msg) == C.JV_KIND_NULL { return "", false } else if C.jv_get_kind(msg) != C.JV_KIND_STRING { msg = C.jv_dump_string(msg, 0) } return C.GoString(C.jv_string_value(msg)), true }
func dumpArray(buf *bytes.Buffer, x C.jv) { ct := C.jv_array_length(C.jv_copy(x)) buf.WriteRune('[') defer buf.WriteRune(']') for i := C.int(0); i < ct; i++ { val := C.jv_array_get(C.jv_copy(x), i) if i > 0 { buf.WriteRune(',') } dumpValue(buf, val) C.jv_free(val) } }
func freeJv(jv C.jv) { C.jv_free(jv) }
// Free this reference to a Jv value. // // Don't call this more than once per jv - might not actually free the memory // as libjq uses reference counting. To make this more like the libjq interface // we return a nil pointer. func (jv *Jv) Free() *Jv { C.jv_free(jv.jv) return nil }