Skip to content

Commit

Permalink
add get_expected_field, get_optional_field
Browse files Browse the repository at this point in the history
  • Loading branch information
bufdev committed Nov 12, 2013
1 parent 3ee5e7b commit 7f0d743
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
41 changes: 41 additions & 0 deletions lib/protocol_buffers/runtime/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,47 @@ def value_for_tag?(tag)
@set_fields[tag] || false
end

def get_expected_field(*nested_field_names)
if nested_field_names.size == 1
field_name = nested_field_names.first
field = self.class.field_for_name(field_name)
raise ArgumentError.new unless field
raise ArgumentError.new unless self.value_for_tag?(field.tag)
return self.value_for_tag(field.tag)
end
last_proto = nested_field_names[0..-2].inject(self) do |sub_proto, ifield_name|
sub_field = sub_proto.class.field_for_name(ifield_name)
raise ArgumentError.new unless sub_field
raise ArgumentError.new unless sub_field.is_a?(ProtocolBuffers::Field::MessageField)
raise ArgumentError.new unless sub_proto.value_for_tag?(sub_field.tag)
sub_proto.value_for_tag(sub_field.tag)
end
last_field_name = nested_field_names.last
last_field = last_proto.class.field_for_name(last_field_name)
raise ArgumentError.new unless last_field
raise ArgumentError.new unless last_proto.value_for_tag?(last_field.tag)
last_proto.value_for_tag(last_field.tag)
end

def get_optional_field(*nested_field_names)
if nested_field_names.size == 1
field_name = nested_field_names.first
field = self.class.field_for_name(field_name)
raise ArgumentError.new unless field
return self.value_for_tag?(field.tag) ? self.value_for_tag(field.tag) : nil
end
last_proto = nested_field_names[0..-2].inject(self) do |sub_proto, ifield_name|
sub_field = sub_proto.class.field_for_name(ifield_name)
raise ArgumentError.new unless sub_field
raise ArgumentError.new unless sub_field.is_a?(ProtocolBuffers::Field::MessageField)
return nil unless sub_proto.value_for_tag?(sub_field.tag)
sub_proto.value_for_tag(sub_field.tag)
end
last_field_name = nested_field_names.last
last_field = last_proto.class.field_for_name(last_field_name)
last_proto.value_for_tag?(last_field.tag) ? last_proto.value_for_tag(last_field.tag) : nil
end

def inspect
ret = ProtocolBuffers.bin_sio
ret << "#<#{self.class.name}"
Expand Down
22 changes: 22 additions & 0 deletions spec/message_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,26 @@

c.value_for_tag?(1).should == true
end

it "correctly handles get_expected_field" do
f = Featureful::A.new
f.i3 = 4
f.sub3.subsub1.subsub_payload = "sub3subsubpayload"

f.get_expected_field(:sub3, :subsub1, :subsub_payload).should == "sub3subsubpayload"
f.get_expected_field(:i3).should == 4
proc { f.get_expected_field(:i2) }.should raise_error(ArgumentError)
proc { f.get_expected_field(:sub2) }.should raise_error(ArgumentError)
end

it "correctly handles get_optional_field" do
f = Featureful::A.new
f.i3 = 4
f.sub3.subsub1.subsub_payload = "sub3subsubpayload"

f.get_optional_field(:sub3, :subsub1, :subsub_payload).should == "sub3subsubpayload"
f.get_optional_field(:i3).should == 4
f.get_optional_field(:i2).should == nil
f.get_optional_field(:sub2).should == nil
end
end

0 comments on commit 7f0d743

Please sign in to comment.