Implement simple values

dev
Alberto Restifo 2020-04-23 23:25:28 +02:00
parent 4872fc4471
commit e7f4426062
6 changed files with 72 additions and 49 deletions

View File

@ -51,19 +51,19 @@ tests = [
# { %(Infinity), "fb 7f f0 00 00 00 00 00 00" }, # { %(Infinity), "fb 7f f0 00 00 00 00 00 00" },
# { %(NaN), "fb 7f f8 00 00 00 00 00 00" }, # { %(NaN), "fb 7f f8 00 00 00 00 00 00" },
# { %(-Infinity), "fb ff f0 00 00 00 00 00 00" }, # { %(-Infinity), "fb ff f0 00 00 00 00 00 00" },
# { %(false), "f4" }, { %(false), "f4" },
# { %(true), "f5" }, { %(true), "f5" },
# { %(null), "f6" }, { %(null), "f6" },
# { %(undefined), "f7" }, { %(undefined), "f7" },
# { %(simple(16)), "f0" }, { %(simple(16)), "f0" },
# { %(simple(24)), "f8 18" }, { %(simple(24)), "f8 18" },
# { %(simple(255)), "f8 ff" }, { %(simple(255)), "f8 ff" },
# { %(0("2013-03-21T20:04:00Z")), "c0 74 32 30 31 33 2d 30 33 2d 32 31 54 32 30 3a 30 34 3a 30 30 5a" }, { %(0("2013-03-21T20:04:00Z")), "c0 74 32 30 31 33 2d 30 33 2d 32 31 54 32 30 3a 30 34 3a 30 30 5a" },
# { %(1(1363896240)), "c1 1a 51 4b 67 b0" }, { %(1(1363896240)), "c1 1a 51 4b 67 b0" },
# { %(1(1363896240.5)), "c1 fb 41 d4 52 d9 ec 20 00 00" }, # { %(1(1363896240.5)), "c1 fb 41 d4 52 d9 ec 20 00 00" },
# { %(23(h'01020304')), "d7 44 01 02 03 04" }, { %(23(h'01020304')), "d7 44 01 02 03 04" },
# { %(24(h'6449455446')), "d8 18 45 64 49 45 54 46" }, { %(24(h'6449455446')), "d8 18 45 64 49 45 54 46" },
# { %(32("http://www.example.com")), "d8 20 76 68 74 74 70 3a 2f 2f 77 77 77 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d" }, { %(32("http://www.example.com")), "d8 20 76 68 74 74 70 3a 2f 2f 77 77 77 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d" },
{ %(h''), "40" }, { %(h''), "40" },
{ %(h'01020304'), "44 01 02 03 04" }, { %(h'01020304'), "44 01 02 03 04" },
{ %(""), "60" }, { %(""), "60" },

View File

@ -50,9 +50,10 @@ class CBOR::Diagnostic
hash_body = read_hash(token.size).join(", ") hash_body = read_hash(token.size).join(", ")
return "{#{hash_body}}" if token.size return "{#{hash_body}}" if token.size
"{_ #{hash_body}}" "{_ #{hash_body}}"
when Token::BoolT when Token::SimpleValueT
return "true" if token.value token.value.to_diagnostic
"false" when Token::TagT
"#{token.value.value.to_s}(#{next_value})"
else else
token.inspect token.inspect
end end

View File

@ -82,10 +82,8 @@ class CBOR::Lexer
when 0xc0..0xdb when 0xc0..0xdb
consume_tag(read_size(byte - 0xc0)) consume_tag(read_size(byte - 0xc0))
################## ##################
when 0xf4 when 0xe0..0xf8
Token::BoolT.new(value: false) consume_simple_value(read_size(byte - 0xe0))
when 0xf5
Token::BoolT.new(value: true)
else else
raise ParseError.new("Unexpected first byte 0x#{byte.to_s(16)}") raise ParseError.new("Unexpected first byte 0x#{byte.to_s(16)}")
end end
@ -172,9 +170,14 @@ 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 private def consume_tag(id) : Token::TagT
raise ParseError.new("Maximum size for tag exceeded") if size > UInt32::MAX raise ParseError.new("Maximum size for tag ID exceeded") if id > UInt32::MAX
Token::TagT.new(id: size.to_u32) Token::TagT.new(value: Tag.new(id.to_u32))
end
private def consume_simple_value(id) : Token::SimpleValueT
raise ParseError.new("Invalid simple value #{id.to_s}") if id > 255
Token::SimpleValueT.new(value: SimpleValue.new(id.to_u8))
end 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

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

@ -0,0 +1,21 @@
enum CBOR::SimpleValue : UInt8
False = 20
True
Null
Undefined
def to_diagnostic : String
case self
when False
"false"
when True
"true"
when Null
"null"
when Undefined
"undefined"
else
"simple(#{self.value.to_s})"
end
end
end

View File

@ -1,21 +1,21 @@
module CBOR::Tag enum CBOR::Tag : UInt32
enum Kind
Unassigned
RFC3339Time RFC3339Time
EpochTime EpochTime
PositiveBigNum PositiveBigNum
NegativeBigNum NegativeBigNum
DecimalFraction Decimal
BigFloat BigFloat
ExpectBase64URLConversion
ExpectBase64Conversion ConvertBase64URL = 21
ExpectBase16Conversion ConvertBase64
EncodedCBOR ConvertBase16
URI CBOREncoded
URI = 32
Base64URL Base64URL
Base64 Base64
RegularExpresion RegularExpression
MIME MimeMessage
SelfDescribeCBOR
end CBORMarker = 55799
end end

View File

@ -1,21 +1,19 @@
module CBOR::Token module CBOR::Token
record NullT, undefined : Bool = false
record BoolT, value : Bool
record IntT, value : Int8 | UInt8 | Int16 | UInt16 | Int32 | UInt32 | Int64 | UInt64 | Int128 record IntT, value : Int8 | UInt8 | Int16 | UInt16 | Int32 | UInt32 | Int64 | UInt64 | Int128
record FloatT, value : Float32 | Float64 record FloatT, value : Float32 | Float64
record BytesT, value : Bytes, chunks : Array(Int32)? = nil record BytesT, value : Bytes, chunks : Array(Int32)? = nil
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 record TagT, value : Tag
record SimpleValueT, value : SimpleValue
alias T = NullT | alias T = IntT |
BoolT |
IntT |
FloatT | FloatT |
BytesT | BytesT |
StringT | StringT |
ArrayT | ArrayT |
MapT | MapT |
TagT TagT |
SimpleValueT
end end