For anyone who stumbles upon this...

The code reference is here 
<https://github.com/protocolbuffers/protobuf/tree/master/ruby/src/main/java/com/google/protobuf/jruby>.
 
Most classes do not have public methods to instantiate them in Ruby, so 
creating new protos programmatically doesn't seem possible.

But it's possible to traverse a proto programmatically and get all the 
fields and types:

```
class TraverseDescriptor
def get_all_fields(klass)
if !klass.respond_to?(:descriptor)
puts "The provided class doesn't have a descriptor!"
return
end

klass.descriptor.each do |n|
puts("#{klass.descriptor.name}: #{n.label}, #{n.name}, #{n.type}")
if n.type == :message
msg_class = n.subtype.msgclass.descriptor.name
get_all_fields(::Google::Protobuf::DescriptorPool.generated_pool.lookup(
msg_class).msgclass)
end
end
end
end
```

To run: # bundle exec ruby -e "require '<path_to_pb>'; require 
'./traverse_descriptor'; 
TraverseDescriptor.new.get_all_fields(Tutorial::AddressBook)"
On Friday, October 22, 2021 at 5:20:50 PM UTC-7 Shine Garg wrote:

> I'd like to leverage this 
> <https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto#L36-L37>
>  to 
> read a `.proto` file *in Ruby* and get a handle on the underlying 
> `FileDescriptorProto` to do some validations. But it's not clear to me how 
> to read the proto file into this object. 
>
> I tried to read both the .proto file as well as the output of the 
> `--descriptor_set_out`. Any guidance would be appreciated.
>
> In bundle console:
>
> // output of --descriptor_set_out dumped to set.txt
> 2.6.3 :114 > fl = File.open("<full path to/set.txt>", "r")
>  => #<File:/path/to/set.txt>
>
> 2.6.3 :115 > Google::Protobuf::FileDescriptor.new(file: fl, package: 
> "tutorial")
> Traceback (most recent call last):
>        16: from ~/.rvm/gems/ruby-2.6.3/bin/bundle:23:in `<main>'
>        15: from ~/.rvm/gems/ruby-2.6.3/bin/bundle:23:in `load'
>        14: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/bundler-1.17.3/exe/bundle:22:in
>  
> `<top (required)>'
>        13: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/friendly_errors.rb:124:in
>  
> `with_friendly_errors'
>        12: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/bundler-1.17.3/exe/bundle:30:in
>  
> `block in <top (required)>'
>        11: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/cli.rb:18:in 
> `start'
>        10: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/vendor/thor/lib/thor/base.rb:466:in
>  
> `start'
>         9: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/cli.rb:27:in 
> `dispatch'
>         8: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/vendor/thor/lib/thor.rb:387:in
>  
> `dispatch'
>         7: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/vendor/thor/lib/thor/invocation.rb:126:in
>  
> `invoke_command'
>         6: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/vendor/thor/lib/thor/command.rb:27:in
>  
> `run'
>         5: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/cli.rb:494:in 
> `console'
>         4: from 
> ~/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/bundler/cli/console.rb:19:in
>  
> `run'
>         3: from (irb):115
>         2: from (irb):115:in `new'
>         1: from (irb):115:in `initialize'
> ArgumentError (wrong number of arguments (given 1, expected 3))
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/protobuf/139d7751-235f-4c77-82bb-54d503b0e9b5n%40googlegroups.com.

Reply via email to