VALUE build_module_from_enumdesc(EnumDescriptor* enumdesc) { VALUE mod = rb_define_module_id( rb_intern(upb_enumdef_fullname(enumdesc->enumdef))); upb_enum_iter it; for (upb_enum_begin(&it, enumdesc->enumdef); !upb_enum_done(&it); upb_enum_next(&it)) { const char* name = upb_enum_iter_name(&it); int32_t value = upb_enum_iter_number(&it); if (name[0] < 'A' || name[0] > 'Z') { rb_raise(rb_eTypeError, "Enum value '%s' does not start with an uppercase letter " "as is required for Ruby constants.", name); } rb_define_const(mod, name, INT2NUM(value)); } rb_define_singleton_method(mod, "lookup", enum_lookup, 1); rb_define_singleton_method(mod, "resolve", enum_resolve, 1); rb_define_singleton_method(mod, "descriptor", enum_descriptor, 0); rb_iv_set(mod, kDescriptorInstanceVar, get_def_obj(enumdesc->enumdef)); return mod; }
/* * call-seq: * EnumDescriptor.name => name * * Returns the name of this enum type. */ VALUE EnumDescriptor_name(VALUE _self) { DEFINE_SELF(EnumDescriptor, self, _self); return rb_str_maybe_null(upb_enumdef_fullname(self->enumdef)); }