From ac1d67d60ea59df07fa05ba376bdc8986a498ba6 Mon Sep 17 00:00:00 2001 From: Karchnu Date: Thu, 26 Nov 2020 17:05:22 +0100 Subject: [PATCH] Decode simple value (Bool or Nil). --- src/cbor/decoder.cr | 8 ++++++++ src/cbor/from_cbor.cr | 21 +++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/cbor/decoder.cr b/src/cbor/decoder.cr index 510fb45..b86a043 100644 --- a/src/cbor/decoder.cr +++ b/src/cbor/decoder.cr @@ -42,6 +42,14 @@ class CBOR::Decoder end end + def read_simple_value : Bool? + case token = @current_token + when Token::SimpleValueT + finish_token! + token.value.to_t + end + end + def read_string : String case token = @current_token when Token::StringT diff --git a/src/cbor/from_cbor.cr b/src/cbor/from_cbor.cr index e2610e7..4977cb7 100644 --- a/src/cbor/from_cbor.cr +++ b/src/cbor/from_cbor.cr @@ -208,13 +208,22 @@ end def Union.new(decoder : CBOR::Decoder) {% begin %} case decoder.current_token - {% if T.includes? Nil %} + {% if T.includes? Nil || T.includes? Bool %} when CBOR::Token::SimpleValueT - return decoder.read_nil - {% end %} - {% if T.includes? Bool %} - when CBOR::Token::SimpleValueT - return decoder.read_bool + # This value could be either a boolean or nil. + value = decoder.read_simple_value + case value + {% if T.includes? Bool %} + when Bool + return value + {% end %} + {% if T.includes? Nil %} + when Nil + return nil + {% end %} + else + raise "value is neither Bool or Nil" + end {% end %} {% if T.includes? String %} when CBOR::Token::StringT