diff --git a/gems/smithy-cbor/lib/smithy-cbor/parser.rb b/gems/smithy-cbor/lib/smithy-cbor/parser.rb index d59889e6a..6401e599d 100644 --- a/gems/smithy-cbor/lib/smithy-cbor/parser.rb +++ b/gems/smithy-cbor/lib/smithy-cbor/parser.rb @@ -35,7 +35,7 @@ def list(shape, values, result = nil) sparse = target.traits.key?('smithy.api#sparse') result = [] if result.nil? values.each do |value| - next if value.nil? && !sparse + raise ParseError, "Expected #{list_member.target.name}, got nil" if value.nil? && !sparse result << parse_shape(list_member, value) end @@ -48,7 +48,7 @@ def map(shape, values, result = nil) sparse = target.traits.key?('smithy.api#sparse') result = {} if result.nil? values.each do |key, value| - next if value.nil? && !sparse + raise ParseError, "Expected #{value_member.target.name}, got nil" if value.nil? && !sparse result[key] = parse_shape(value_member, value) end diff --git a/gems/smithy-cbor/spec/smithy-cbor/parser_spec.rb b/gems/smithy-cbor/spec/smithy-cbor/parser_spec.rb index 860c5d83b..52564d9fb 100644 --- a/gems/smithy-cbor/spec/smithy-cbor/parser_spec.rb +++ b/gems/smithy-cbor/spec/smithy-cbor/parser_spec.rb @@ -114,10 +114,11 @@ module Cbor expect(subject.parse(structure_shape, bytes).to_h).to eq(list: ['string']) end - it 'parses lists with nil values' do + it 'rejects nil values in non-sparse lists' do data = { 'list' => [nil] } bytes = Cbor.encode(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(list: []) + expect { subject.parse(structure_shape, bytes) } + .to raise_error(Cbor::ParseError, 'Expected String, got nil') end it 'parses sparse lists' do @@ -135,10 +136,11 @@ module Cbor expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => 'value' }) end - it 'parses maps with nil values' do + it 'rejects nil values in non-sparse maps' do data = { 'map' => { 'key' => nil } } bytes = Cbor.encode(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(map: {}) + expect { subject.parse(structure_shape, bytes) } + .to raise_error(Cbor::ParseError, 'Expected String, got nil') end it 'parses sparse maps' do diff --git a/gems/smithy-json/lib/smithy-json/parser.rb b/gems/smithy-json/lib/smithy-json/parser.rb index 706d1b9b0..ea96ed90a 100644 --- a/gems/smithy-json/lib/smithy-json/parser.rb +++ b/gems/smithy-json/lib/smithy-json/parser.rb @@ -50,7 +50,7 @@ def list(shape, values, result = nil) sparse = target.traits.key?('smithy.api#sparse') result = [] if result.nil? values.each do |value| - next if value.nil? && !sparse + raise ParseError, "Expected #{member.target.name}, got nil" if value.nil? && !sparse result << parse_shape(member, value) end @@ -63,7 +63,7 @@ def map(shape, values, result = nil) sparse = target.traits.key?('smithy.api#sparse') result = {} if result.nil? values.each do |key, value| - next if value.nil? && !sparse + raise ParseError, "Expected #{value_member.target.name}, got nil" if value.nil? && !sparse result[key] = parse_shape(value_member, value) end diff --git a/gems/smithy-json/spec/smithy-json/parser_spec.rb b/gems/smithy-json/spec/smithy-json/parser_spec.rb index 37bbe15e1..93a9d3d2c 100644 --- a/gems/smithy-json/spec/smithy-json/parser_spec.rb +++ b/gems/smithy-json/spec/smithy-json/parser_spec.rb @@ -123,7 +123,8 @@ module Json it 'parses unknown members' do data = { union: { 'someThing' => 'someValue' } } bytes = Json.dump(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(union: { unknown: { 'someThing' => 'someValue' } }) + expect(subject.parse(structure_shape, bytes).to_h) + .to eq(union: { unknown: { 'someThing' => 'someValue' } }) end it 'parsing ignores an extra __type key' do @@ -152,10 +153,11 @@ module Json expect(subject.parse(structure_shape, bytes).to_h).to eq(list: ['string']) end - it 'parses lists with nil values' do + it 'rejects nil values in non-sparse lists' do data = { 'list' => [nil] } bytes = Json.dump(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(list: []) + expect { subject.parse(structure_shape, bytes) } + .to raise_error(Json::ParseError, 'Expected String, got nil') end it 'parses sparse lists' do @@ -173,17 +175,19 @@ module Json expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => 'value' }) end - it 'parses maps with nil values' do + it 'rejects nil values in non-sparse maps' do data = { 'map' => { 'key' => nil } } bytes = Json.dump(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(map: {}) + expect { subject.parse(structure_shape, bytes) } + .to raise_error(Json::ParseError, 'Expected String, got nil') end it 'parses sparse maps' do shapes['smithy.ruby.tests#Map']['traits'] = { 'smithy.api#sparse' => {} } data = { 'map' => { 'key' => nil, 'anotherKey' => 'value' } } bytes = Json.dump(data) - expect(subject.parse(structure_shape, bytes).to_h).to eq(map: { 'key' => nil, 'anotherKey' => 'value' }) + expect(subject.parse(structure_shape, bytes).to_h) + .to eq(map: { 'key' => nil, 'anotherKey' => 'value' }) end end @@ -243,7 +247,8 @@ module Json it 'handles unrecognized timestamp formats' do data = { 'timestamp' => 'unrecognized format' } bytes = Json.dump(data) - expect { subject.parse(structure_shape, bytes) }.to raise_error(/unhandled epoch-seconds timestamp/) + expect { subject.parse(structure_shape, bytes) } + .to raise_error(/unhandled epoch-seconds timestamp/) end end end