initial commit: cq, json-to-cbor, benchmark json vs cbor
commit
7e4470112b
|
@ -0,0 +1,3 @@
|
||||||
|
lib
|
||||||
|
bin
|
||||||
|
shard.lock
|
|
@ -0,0 +1,23 @@
|
||||||
|
name: cq
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- Karchnu <karchnu@karchnu.fr>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
CBOR Query program, similar to jq.
|
||||||
|
|
||||||
|
targets:
|
||||||
|
cq:
|
||||||
|
main: src/cq.cr
|
||||||
|
json-to-cbor:
|
||||||
|
main: src/json-to-cbor.cr
|
||||||
|
bm-json-vs-cbor:
|
||||||
|
main: tests/json-vs-cbor.cr
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
cbor:
|
||||||
|
branch: float16
|
||||||
|
git: https://git.sr.ht/~karchnu/crystal-cbor
|
||||||
|
|
||||||
|
license: ISC
|
|
@ -0,0 +1,34 @@
|
||||||
|
require "cbor"
|
||||||
|
|
||||||
|
if ARGV.size >= 1 && ARGV[0] == "-h"
|
||||||
|
puts "usage: cq < file.cbor"
|
||||||
|
puts "usage: cq [attribute] < file"
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
data = CBOR::Decoder.new(STDIN).read_value
|
||||||
|
|
||||||
|
if ARGV.size == 0
|
||||||
|
pp data
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def dig(data, attribute : String)
|
||||||
|
case data
|
||||||
|
when Hash
|
||||||
|
if v = data[attribute]?
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
else
|
||||||
|
STDERR.puts "attribute not found: #{attribute}"
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ARGV.each do |attribute|
|
||||||
|
current_data = data.clone
|
||||||
|
attribute.split(/[.]/).each do |attr|
|
||||||
|
current_data = dig current_data, attr
|
||||||
|
end
|
||||||
|
pp current_data
|
||||||
|
end
|
|
@ -0,0 +1,10 @@
|
||||||
|
require "cbor"
|
||||||
|
require "json"
|
||||||
|
|
||||||
|
if ARGV.size >= 1
|
||||||
|
puts "usage: json-to-cbor < file.json > file.cbor"
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
json_content = JSON.parse STDIN.gets_to_end
|
||||||
|
STDOUT.write json_content.to_cbor
|
|
@ -0,0 +1,37 @@
|
||||||
|
require "benchmark"
|
||||||
|
require "json"
|
||||||
|
require "cbor"
|
||||||
|
|
||||||
|
if ARGV.size == 0 || ARGV[0] == "-h"
|
||||||
|
puts "usage: #{PROGRAM_NAME} json-file"
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
json_file = ARGV[0]
|
||||||
|
cbor_file = ARGV[0].gsub("json", "cbor")
|
||||||
|
|
||||||
|
json_content = File.read(json_file)
|
||||||
|
cbor_content = File.read(cbor_file).to_slice
|
||||||
|
|
||||||
|
json_value = JSON.parse json_content
|
||||||
|
cbor_value = CBOR::Decoder.new(cbor_content).read_value
|
||||||
|
|
||||||
|
Benchmark.ips do |bm|
|
||||||
|
bm.report("JSON.parse") do
|
||||||
|
_ = JSON.parse json_content
|
||||||
|
end
|
||||||
|
|
||||||
|
bm.report("CBOR::Decoder.new(input).read_value") do
|
||||||
|
_ = CBOR::Decoder.new(cbor_content).read_value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Benchmark.ips do |bm|
|
||||||
|
bm.report("to_json") do
|
||||||
|
_ = json_value.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
bm.report("to_cbor") do
|
||||||
|
_ = cbor_value.to_cbor
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue