diff options
Diffstat (limited to 'third_party/protobuf/3.4.0/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java')
-rw-r--r-- | third_party/protobuf/3.4.0/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/third_party/protobuf/3.4.0/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java b/third_party/protobuf/3.4.0/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java new file mode 100644 index 0000000000..cc4ab66284 --- /dev/null +++ b/third_party/protobuf/3.4.0/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java @@ -0,0 +1,124 @@ +package com.google.protobuf.jruby; + +import com.google.protobuf.DescriptorProtos; +import com.google.protobuf.Descriptors; +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.*; + +@JRubyClass(name = "OneofDescriptor", include = "Enumerable") +public class RubyOneofDescriptor extends RubyObject { + + public static void createRubyOneofDescriptor(Ruby runtime) { + RubyModule protobuf = runtime.getClassFromPath("Google::Protobuf"); + RubyClass cRubyOneofDescriptor = protobuf.defineClassUnder("OneofDescriptor", runtime.getObject(), new ObjectAllocator() { + @Override + public IRubyObject allocate(Ruby ruby, RubyClass rubyClass) { + return new RubyOneofDescriptor(ruby, rubyClass); + } + }); + cRubyOneofDescriptor.defineAnnotatedMethods(RubyOneofDescriptor.class); + cRubyOneofDescriptor.includeModule(runtime.getEnumerable()); + } + + public RubyOneofDescriptor(Ruby ruby, RubyClass rubyClass) { + super(ruby, rubyClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + builder = DescriptorProtos.OneofDescriptorProto.newBuilder(); + fields = new ArrayList<RubyFieldDescriptor>(); + return this; + } + + /* + * call-seq: + * OneofDescriptor.name => name + * + * Returns the name of this oneof. + */ + @JRubyMethod(name = "name") + public IRubyObject getName(ThreadContext context) { + return name; + } + + /* + * call-seq: + * OneofDescriptor.name = name + * + * Sets a new name for this oneof. The oneof must not have been added to a + * message descriptor yet. + */ + @JRubyMethod(name = "name=") + public IRubyObject setName(ThreadContext context, IRubyObject name) { + this.name = context.runtime.newString(name.asJavaString()); + this.builder.setName(name.asJavaString()); + return context.runtime.getNil(); + } + + /* + * call-seq: + * OneofDescriptor.add_field(field) => nil + * + * Adds a field to this oneof. The field may have been added to this oneof in + * the past, or the message to which this oneof belongs (if any), but may not + * have already been added to any other oneof or message. Otherwise, an + * exception is raised. + * + * All fields added to the oneof via this method will be automatically added to + * the message to which this oneof belongs, if it belongs to one currently, or + * else will be added to any message to which the oneof is later added at the + * time that it is added. + */ + @JRubyMethod(name = "add_field") + public IRubyObject addField(ThreadContext context, IRubyObject obj) { + RubyFieldDescriptor fieldDescriptor = (RubyFieldDescriptor) obj; + fieldDescriptor.setOneofName(this.name); + fields.add(fieldDescriptor); + return context.runtime.getNil(); + } + + /* + * call-seq: + * OneofDescriptor.each(&block) => nil + * + * Iterates through fields in this oneof, yielding to the block on each one. + */ + @JRubyMethod + public IRubyObject each(ThreadContext context, Block block) { + for (RubyFieldDescriptor field : fields) { + block.yieldSpecific(context, field); + } + return context.runtime.getNil(); + } + + public DescriptorProtos.OneofDescriptorProto build(int index) { + for (RubyFieldDescriptor field: fields) { + field.setOneofIndex(index); + } + return this.builder.build(); + } + + protected Collection<RubyFieldDescriptor> getFields() { + return fields; + } + + protected Descriptors.OneofDescriptor getOneofDescriptor() { + RubyFieldDescriptor fieldDescriptor = fields.get(0); + return fieldDescriptor.getFieldDef().getContainingOneof(); + } + + private IRubyObject name; + private DescriptorProtos.OneofDescriptorProto.Builder builder; + private List<RubyFieldDescriptor> fields; +} |