Add Tag decoding

dev
Alberto Restifo 2020-04-23 10:57:33 +02:00 committed by Alberto Restifo
parent 9c5afcd34d
commit 4872fc4471
3 changed files with 31 additions and 1 deletions

View File

@ -79,6 +79,8 @@ class CBOR::Lexer
map_start(read_size(byte - 0xa0)) map_start(read_size(byte - 0xa0))
when 0xbf when 0xbf
Token::MapT.new Token::MapT.new
when 0xc0..0xdb
consume_tag(read_size(byte - 0xc0))
################## ##################
when 0xf4 when 0xf4
Token::BoolT.new(value: false) Token::BoolT.new(value: false)
@ -170,6 +172,11 @@ class CBOR::Lexer
Token::MapT.new(size: size.to_i32) Token::MapT.new(size: size.to_i32)
end end
private def consume_tag(size) : Token::TagT
raise ParseError.new("Maximum size for tag exceeded") if size > UInt32::MAX
Token::TagT.new(id: size.to_u32)
end
# Creates a method overloaded for each UInt sizes to convert the UInt into # Creates a method overloaded for each UInt sizes to convert the UInt into
# the respective Int capable of containing the value # the respective Int capable of containing the value

21
src/cbor/tag.cr Normal file
View File

@ -0,0 +1,21 @@
module CBOR::Tag
enum Kind
Unassigned
RFC3339Time
EpochTime
PositiveBigNum
NegativeBigNum
DecimalFraction
BigFloat
ExpectBase64URLConversion
ExpectBase64Conversion
ExpectBase16Conversion
EncodedCBOR
URI
Base64URL
Base64
RegularExpresion
MIME
SelfDescribeCBOR
end
end

View File

@ -7,6 +7,7 @@ module CBOR::Token
record StringT, value : String, chunks : Array(Int32)? = nil record StringT, value : String, chunks : Array(Int32)? = nil
record ArrayT, size : Int32? = nil record ArrayT, size : Int32? = nil
record MapT, size : Int32? = nil record MapT, size : Int32? = nil
record TagT, id : UInt32
alias T = NullT | alias T = NullT |
BoolT | BoolT |
@ -15,5 +16,6 @@ module CBOR::Token
BytesT | BytesT |
StringT | StringT |
ArrayT | ArrayT |
MapT MapT |
TagT
end end