def cbor_diagnostic(options = {})
if lengths = cbor_stream?
pos = 0
"(_ #{lengths.map{|l| r = self[pos, l].cbor_diagnostic(options); pos += l; r}.join(", ")})"
else
if encoding == Encoding::BINARY
if options[:try_decode_embedded] && self != ''
begin
rest = self
result = []
while rest != ''
dv, rest = CBOR.decode_with_rest(rest)
result << dv
end
return "<< #{result.map{|x| x.cbor_diagnostic(options)}.join(", ")} >>"
rescue StandardError => e
end
end
if options[:bytes_as_text] && (u8 = dup.force_encoding(Encoding::UTF_8)).valid_encoding?
"'#{u8.cbor_diagnostic(bytes_as_text: true,
utf8: options[:utf8]
)[1..-2].gsub(/(')|(\\")|(\\.)|([^\\']+)/) {
if $1
"\\'"
elsif $2
"\""
elsif $3
$3
elsif $4
$4
else
fail
end}}'"
else
"h'#{hexbytes}'"
end
else
if options[:utf8]
to_json
else
to_json.encode(Encoding::UTF_16BE).bytes.each_slice(2).map {
|c1, c2| c = (c1 << 8)+c2; c < 128 ? c.chr : '\u%04x' % c }.join
end
end
end
end