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