From 15a94a1609781b0a08143a1b0cd41068ea98deb5 Mon Sep 17 00:00:00 2001 From: Karchnu Date: Mon, 30 Nov 2020 01:40:50 +0100 Subject: [PATCH] string-keys-to-int: WIP --- shard.yml | 2 ++ src/string-keys-to-int.cr | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/string-keys-to-int.cr diff --git a/shard.yml b/shard.yml index fe1de54..8293371 100644 --- a/shard.yml +++ b/shard.yml @@ -14,6 +14,8 @@ targets: main: src/json-to-cbor.cr hs: main: src/hs.cr + string-keys-to-int: + main: src/string-keys-to-int.cr bm-json-vs-cbor: main: tests/json-vs-cbor.cr diff --git a/src/string-keys-to-int.cr b/src/string-keys-to-int.cr new file mode 100644 index 0000000..1bcc1c4 --- /dev/null +++ b/src/string-keys-to-int.cr @@ -0,0 +1,54 @@ +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