Compare commits

..

No commits in common. "master" and "v0.1.1" have entirely different histories.

4 changed files with 9 additions and 50 deletions

View file

@ -2,30 +2,6 @@
Command-line tool to encode and decode arbitrary protobuf data. Command-line tool to encode and decode arbitrary protobuf data.
## Installation
This program requires Crystal. See: https://crystal-lang.org/install/
### Standalone
1. Clone: `git clone https://github.com/iv-org/protodec && cd protodec`
2. Build: `crystal build src/protodec.cr`
3. See [Usage](#Usage) below
### As a Crystal library
Add this to your application's `shard.yml`:
```yaml
dependencies:
protodec:
github: iv-org/protodec
version: ~> 0.1.5
```
## Usage ## Usage
``` ```
@ -81,13 +57,9 @@ $ echo 'CkEKCeOCj+OBn+OBlxDSCSIQWmQ730+N8z8tsp3vp8YJQCoSCAESBzA4MDAwMDAaBQ26sSZE
} }
``` ```
## Windows
Windows users can run the binaries in a linux-on-windows tool (like Git bash or WSL) or use the official [protobuf binaries](https://github.com/protocolbuffers/protobuf/releases) to encode/decode protobuf data.
## Contributing ## Contributing
1. Fork it (<https://github.com/iv-org/protodec/fork>) 1. Fork it (<https://github.com/omarroth/protodec/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`) 2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`) 3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`) 4. Push to the branch (`git push origin my-new-feature`)

View file

@ -1,14 +1,13 @@
name: protodec name: protodec
version: 0.1.5 version: 0.1.1
authors: authors:
- Omar Roth <omarroth@protonmail.com> - Omar Roth <omarroth@protonmail.com>
- Invidous team
targets: targets:
protodec: protodec:
main: src/protodec.cr main: src/protodec.cr
crystal: ">= 0.34.0, < 2.0.0" crystal: 0.31.1
license: GPLv3 license: GPLv3

View file

@ -2,7 +2,7 @@ require "./spec_helper"
describe Protodec do describe Protodec do
it "decodes Base64 data" do it "decodes Base64 data" do
input = "4qmFsgIsEhhVQ0NqOTU2SUY2MkZiVDdHb3VzemFqOXcaEEVnbGpiMjF0ZFc1cGRIaz0" input = "4qmFsgIrEhhVQ0NqOTU2SUY2MkZiVDdHb3VzemFqOXcaD0VnbGpiMjF0ZFc1cGRIaw"
output = input.strip output = input.strip
.try { |i| URI.decode_www_form(i) } .try { |i| URI.decode_www_form(i) }
.try { |i| URI.decode_www_form(i) } .try { |i| URI.decode_www_form(i) }
@ -24,6 +24,6 @@ describe Protodec do
}, },
}) })
Base64.urlsafe_encode(Protodec::Any.from_json(object), padding: false).should eq("4qmFsgIsEhhVQ0NqOTU2SUY2MkZiVDdHb3VzemFqOXcaEEVnbGpiMjF0ZFc1cGRIaz0") Base64.urlsafe_encode(Protodec::Any.from_json(object), padding: false).should eq("4qmFsgIrEhhVQ0NqOTU2SUY2MkZiVDdHb3VzemFqOXcaD0VnbGpiMjF0ZFc1cGRIaw")
end end
end end

View file

@ -200,7 +200,7 @@ module Protodec
from_json(value, buffer) from_json(value, buffer)
buffer.rewind buffer.rewind
buffer = Base64.urlsafe_encode(buffer) buffer = Base64.urlsafe_encode(buffer, padding: false)
VarLong.to_io(io, buffer.bytesize.to_i64) VarLong.to_io(io, buffer.bytesize.to_i64)
buffer.to_s(io) buffer.to_s(io)
when "embedded" when "embedded"
@ -213,9 +213,6 @@ module Protodec
when "bytes" when "bytes"
VarLong.to_io(io, value.size.to_i64) VarLong.to_io(io, value.size.to_i64)
value.as_a.each { |byte| io.write_byte byte.as_i.to_u8 } value.as_a.each { |byte| io.write_byte byte.as_i.to_u8 }
else # "string"
VarLong.to_io(io, value.to_s.bytesize.to_i64)
io.print value.to_s
end end
end end
else else
@ -468,22 +465,13 @@ module Protodec
Any.new(raw.clone) Any.new(raw.clone)
end end
def self.cast_json(object : Hash) def self.cast_json(object)
raise "Invalid type" if !object.is_a?(Hash)
JSON::Any.new(object.transform_values do |value| JSON::Any.new(object.transform_values do |value|
case value case value
when .is_a?(Hash) when .is_a?(Hash)
cast_json(value) cast_json(value)
when .is_a?(Protodec::Any)
case raw = value.raw
when Array(UInt8)
JSON::Any.new(raw.map { |i| JSON::Any.new(i.to_i64) })
when Int32
JSON::Any.new(raw.to_i64)
when Hash(String, Protodec::Any)
cast_json(raw)
else
JSON::Any.new(raw)
end
else else
JSON::Any.new(value) JSON::Any.new(value)
end end