@@ -13,7 +13,7 @@ def initialize(options = {})
1313 end
1414
1515 def deserialize ( shape , bytes , target )
16- return { } if bytes . empty? || shape == Prelude :: Unit
16+ return { } if bytes . empty?
1717
1818 shape ( shape , CBOR . decode ( bytes ) , target )
1919 end
@@ -63,32 +63,32 @@ def map(shape, values, target = nil)
6363 end
6464
6565 def structure ( shape , values , target = nil )
66- # TODO: iterate shape members instead of values
6766 return Schema ::EmptyStructure . new if shape == Prelude ::Unit
6867
6968 target = shape . type . new if target . nil?
70- values . each do |key , value |
71- next unless shape . name_by_member_name? ( key )
69+ shape . members . each do |member_name , member_shape |
70+ key = member_shape . name
71+ next unless values . key? ( key )
7272
73- name = shape . name_by_member_name ( key )
74- member_shape = shape . member ( name )
75- target [ name ] = shape ( member_shape . shape , value )
73+ target [ member_name ] = shape ( member_shape . shape , values [ key ] )
7674 end
7775 target
7876 end
7977
80- def union ( shape , values , target = nil )
81- # TODO: delete target instead of checking key?
78+ def union ( shape , values , target = nil ) # rubocop:disable Metrics/AbcSize
79+ raise ArgumentError , "union value includes more than one key, received: #{ values . keys } " if values . size > 1
80+
8281 key , value = values . flatten
83- return nil if key . nil? || key == ' __target'
82+ return nil if key . nil?
83+
84+ shape . members . each do |member_name , member_shape |
85+ name = member_shape . name
86+ next unless values . key? ( name )
8487
85- if shape . name_by_member_name? ( key )
86- member_name = shape . name_by_member_name ( key )
8788 target = shape . member_type ( member_name ) if target . nil?
88- target . new ( shape ( shape . member ( member_name ) . shape , value ) )
89- else
90- shape . member_type ( :unknown ) . new ( key , value )
89+ return target . new ( shape ( member_shape . shape , values [ name ] ) )
9190 end
91+ shape . member_type ( :unknown ) . new ( key , value )
9292 end
9393
9494 def sparse? ( shape )
0 commit comments