From e61c13c59a5352c68578a0cbcb6fbc702cc54db0 Mon Sep 17 00:00:00 2001 From: MQuy Date: Thu, 26 Jan 2023 23:27:18 +0700 Subject: [PATCH] feat(6178): emit ruby enum as integer --- ruby/ext/google/protobuf_c/message.c | 5 +++++ ruby/tests/encode_decode_test.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index 067a446615..bea488315c 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -1164,6 +1164,11 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) { Qfalse))) { options |= upb_JsonEncode_EmitDefaults; } + + if (RTEST(rb_hash_lookup2(hash_args, ID2SYM(rb_intern("enums_as_integers")), + Qfalse))) { + options |= upb_JsonEncode_FormatEnumsAsIntegers; + } } upb_Status_Clear(&status); diff --git a/ruby/tests/encode_decode_test.rb b/ruby/tests/encode_decode_test.rb index df2cd3632d..2b36cd1016 100755 --- a/ruby/tests/encode_decode_test.rb +++ b/ruby/tests/encode_decode_test.rb @@ -84,6 +84,34 @@ class EncodeDecodeTest < Test::Unit::TestCase ) assert_match 'optional_int32', json + + + # Test for enums printing as ints. + msg = A::B::C::TestMessage.new({ optional_enum: 1 }) + json = A::B::C::TestMessage.encode_json( + msg, + { :enums_as_integers => true } + ) + + assert_match '"optionalEnum":1', json + + # Test for default enum being printed as int. + msg = A::B::C::TestMessage.new({ optional_enum: 0 }) + json = A::B::C::TestMessage.encode_json( + msg, + { :enums_as_integers => true, :emit_defaults => true } + ) + + assert_match '"optionalEnum":0', json + + # Test for repeated enums printing as ints. + msg = A::B::C::TestMessage.new({ repeated_enum: [0,1,2,3] }) + json = A::B::C::TestMessage.encode_json( + msg, + { :enums_as_integers => true } + ) + + assert_match '"repeatedEnum":[0,1,2,3]', json end def test_encode_wrong_msg