mirror of
https://github.com/iv-org/protodec.git
synced 2024-10-01 09:05:44 +00:00
Minor refactor
This commit is contained in:
parent
d70b15c946
commit
5b60fe7736
118
src/protodec.cr
118
src/protodec.cr
@ -55,7 +55,7 @@ struct VarLong
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class ProtoBuf
|
struct ProtoBuf::Any
|
||||||
enum Tag
|
enum Tag
|
||||||
VarInt = 0
|
VarInt = 0
|
||||||
Bit64 = 1
|
Bit64 = 1
|
||||||
@ -63,81 +63,77 @@ class ProtoBuf
|
|||||||
Bit32 = 5
|
Bit32 = 5
|
||||||
end
|
end
|
||||||
|
|
||||||
struct Any
|
alias Type = Int64 |
|
||||||
alias Type = Int64 |
|
Bytes |
|
||||||
Array(UInt8) |
|
String |
|
||||||
String |
|
Hash(Int32, Type)
|
||||||
Hash(Int32, Type)
|
|
||||||
|
|
||||||
getter raw : Type
|
getter raw : Type
|
||||||
|
|
||||||
def initialize(@raw : Type)
|
def initialize(@raw : Type)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.parse(io : IO)
|
def self.parse(io : IO)
|
||||||
from_io(io, ignore_exceptions: true)
|
from_io(io, ignore_exceptions: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.from_io(io : IO, format = IO::ByteFormat::NetworkEndian, ignore_exceptions = false)
|
def self.from_io(io : IO, format = IO::ByteFormat::NetworkEndian, ignore_exceptions = false)
|
||||||
item = new({} of Int32 => Type)
|
item = new({} of Int32 => Type)
|
||||||
|
|
||||||
begin
|
begin
|
||||||
until io.pos == io.size
|
until io.pos == io.size
|
||||||
header = io.read_bytes(VarLong)
|
header = io.read_bytes(VarLong)
|
||||||
field = (header >> 3).to_i
|
field = (header >> 3).to_i
|
||||||
type = Tag.new((header & 0b111).to_i)
|
type = Tag.new((header & 0b111).to_i)
|
||||||
|
|
||||||
case type
|
case type
|
||||||
when Tag::VarInt
|
when Tag::VarInt
|
||||||
value = io.read_bytes(VarLong)
|
value = io.read_bytes(VarLong)
|
||||||
when Tag::Bit64
|
when Tag::Bit64
|
||||||
value = Bytes.new(8)
|
value = Bytes.new(8)
|
||||||
io.read_fully(value)
|
io.read_fully(value)
|
||||||
value = value.to_a
|
when Tag::LengthDelimited
|
||||||
when Tag::LengthDelimited
|
bytes = Bytes.new(io.read_bytes(VarLong))
|
||||||
bytes = Bytes.new(io.read_bytes(VarLong))
|
io.read_fully(bytes)
|
||||||
io.read_fully(bytes)
|
|
||||||
|
|
||||||
if bytes.empty?
|
if bytes.empty?
|
||||||
value = ""
|
value = ""
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
value = from_io(IO::Memory.new(Base64.decode(URI.unescape(String.new(bytes))))).raw
|
value = from_io(IO::Memory.new(Base64.decode(URI.unescape(String.new(bytes))))).raw
|
||||||
rescue ex
|
rescue ex
|
||||||
if bytes.all? { |byte| {'\t'.ord, '\n'.ord, '\r'.ord}.includes?(byte) || byte >= 0x20 }
|
if bytes.all? { |byte| {'\t'.ord, '\n'.ord, '\r'.ord}.includes?(byte) || byte >= 0x20 }
|
||||||
value = String.new(bytes)
|
value = String.new(bytes)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
value = from_io(IO::Memory.new(bytes)).raw
|
value = from_io(IO::Memory.new(bytes)).raw
|
||||||
rescue ex
|
rescue ex
|
||||||
value = bytes.to_a
|
value = bytes
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
when Tag::Bit32
|
|
||||||
value = Bytes.new(4)
|
|
||||||
io.read_fully(value)
|
|
||||||
value = value.to_a
|
|
||||||
else
|
|
||||||
break if ignore_exceptions
|
|
||||||
raise "Invalid type #{type}"
|
|
||||||
end
|
end
|
||||||
|
when Tag::Bit32
|
||||||
item[field] = value.as(Type)
|
value = Bytes.new(4)
|
||||||
|
io.read_fully(value)
|
||||||
|
else
|
||||||
|
break if ignore_exceptions
|
||||||
|
raise "Invalid type #{type}"
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
item
|
item[field] = value.as(Type)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def []=(key : Int32, value : Type)
|
item
|
||||||
case object = @raw
|
end
|
||||||
when Hash
|
|
||||||
object[key] = value
|
def []=(key : Int32, value : Type)
|
||||||
else
|
case object = @raw
|
||||||
raise "Expected Hash for #[]=(key : Int32, value : Type), not #{object.class}"
|
when Hash
|
||||||
end
|
object[key] = value
|
||||||
|
else
|
||||||
|
raise "Expected Hash for #[]=(key : Int32, value : Type), not #{object.class}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user