Skip to content

Commit 8563b4c

Browse files
authored
allow for Enum Value Aliases (#43)
1 parent 92f62be commit 8563b4c

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

src/spb-proto-compiler/dumper/json/dumper.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <cctype>
2121
#include <cstdint>
2222
#include <map>
23+
#include <set>
2324
#include <spb/json/deserialize.hpp>
2425
#include <sstream>
2526
#include <stdexcept>
@@ -213,10 +214,13 @@ void dump_cpp_serialize_value( std::ostream & stream, const proto_enum & my_enum
213214
stream << "void serialize_value( detail::ostream & stream, const " << full_name
214215
<< " & value )\n{\n";
215216
stream << "\tswitch( value )\n\t{\n";
217+
std::set<int32_t> numbers_taken;
216218
for( const auto & field : my_enum.fields )
217219
{
220+
if (numbers_taken.contains(field.number)) continue;
218221
stream << "\tcase " << full_name << "::" << field.name
219222
<< ":\n\t\treturn stream.serialize( \"" << field.name << "\"sv);\n";
223+
numbers_taken.insert(field.number);
220224
}
221225
stream << "\tdefault:\n\t\tthrow std::system_error( std::make_error_code( "
222226
"std::errc::invalid_argument ) );\n";
@@ -273,9 +277,12 @@ void dump_cpp_deserialize_value( std::ostream & stream, const proto_enum & my_en
273277
"std::errc::invalid_argument ) );\n";
274278
stream << "\t\t},\n\t\t[&]( int32_t enum_int )\n\t\t{\n\t\t\tswitch( " << full_name
275279
<< "( enum_int ) )\n\t\t\t{\n";
280+
std::set<int32_t> numbers_taken;
276281
for( const auto & field : my_enum.fields )
277282
{
283+
if (numbers_taken.contains(field.number)) continue;
278284
stream << "\t\t\tcase " << full_name << "::" << field.name << ":\n";
285+
numbers_taken.insert(field.number);
279286
}
280287
stream << "\t\t\t\tvalue = " << full_name << "( enum_int );\n\t\t\t\treturn ;\n";
281288
stream << "\t\t\t}\n\t\t\tthrow std::system_error( std::make_error_code( "

0 commit comments

Comments
 (0)