cq/src/string-keys-to-int.cr

55 lines
915 B
Crystal

require "cbor"
if ARGV.size >= 1 && ARGV[0] == "-h"
puts "usage: cbor-from-string-to-int-hash-keys < file.cbor"
puts "usage: cbor-from-string-to-int-hash-keys [attribute] < file"
exit 0
end
def are_hash_keys_all_int?(data)
case d = data
when Hash
keys = d.keys
if keys.all? {|v| v.is_a?(String) }
keys.all? {|v| v.as(String).to_i64 rescue false }
else
false
end
else
false
end
end
def change(data)
# 1. change keys
if are_hash_keys_all_int? data
puts "YES, DO IT, keys: #{data.as(Hash).keys}"
end
# 2. dig
case d = data
when Hash
keys = d.keys
keys.each do |k|
change d[k]
end
end
end
buffer = Bytes.new 1_000_000 # 1 MB
until STDIN.read(buffer) == 0
decoder = CBOR::Decoder.new(buffer)
while data = decoder.read_value
break if data == 0
# pp data
change data
# STDOUT.write data.to_cbor
# STDOUT.flush
end
buffer = Bytes.new 1_000_000 # 1 MB
end