Commit a8e800bd authored by cryptocode's avatar cryptocode Committed by Wouter van Oortmerssen

Add --force-empty-vectors option (#5653)

The rationale for this option is that JSON clients typically want empty arrays (i.e [] in the JSON) instead of missing properties, but not empty strings when the value isn't set.
--force-empty is kept as-is, i.e. it will force both empty strings and vectors.

Closes #5652
parent d7530ae9
...@@ -203,5 +203,8 @@ Additional options: ...@@ -203,5 +203,8 @@ Additional options:
- `--force-empty` : When serializing from object API representation, force - `--force-empty` : When serializing from object API representation, force
strings and vectors to empty rather than null. strings and vectors to empty rather than null.
- `--force-empty-vectors` : When serializing from object API representation, force
vectors to empty rather than null.
NOTE: short-form options for generators are deprecated, use the long form NOTE: short-form options for generators are deprecated, use the long form
whenever possible. whenever possible.
...@@ -588,9 +588,13 @@ struct IDLOptions { ...@@ -588,9 +588,13 @@ struct IDLOptions {
// for code generation. // for code generation.
unsigned long lang_to_generate; unsigned long lang_to_generate;
// If set (default behavior), empty string and vector fields will be set to // If set (default behavior), empty string fields will be set to nullptr to make
// nullptr to make the flatbuffer more compact. // the flatbuffer more compact.
bool set_empty_to_null; bool set_empty_strings_to_null;
// If set (default behavior), empty vector fields will be set to nullptr to make
// the flatbuffer more compact.
bool set_empty_vectors_to_null;
IDLOptions() IDLOptions()
: use_flexbuffers(false), : use_flexbuffers(false),
...@@ -635,7 +639,8 @@ struct IDLOptions { ...@@ -635,7 +639,8 @@ struct IDLOptions {
lang(IDLOptions::kJava), lang(IDLOptions::kJava),
mini_reflect(IDLOptions::kNone), mini_reflect(IDLOptions::kNone),
lang_to_generate(0), lang_to_generate(0),
set_empty_to_null(true) {} set_empty_strings_to_null(true),
set_empty_vectors_to_null(true) {}
}; };
// This encapsulates where the parser is in the current source file. // This encapsulates where the parser is in the current source file.
......
This diff is collapsed.
...@@ -2452,10 +2452,10 @@ class CppGenerator : public BaseGenerator { ...@@ -2452,10 +2452,10 @@ class CppGenerator : public BaseGenerator {
// For optional fields, check to see if there actually is any data // For optional fields, check to see if there actually is any data
// in _o->field before attempting to access it. If there isn't, // in _o->field before attempting to access it. If there isn't,
// depending on set_empty_to_null either set it to 0 or an empty string. // depending on set_empty_strings_to_null either set it to 0 or an empty string.
if (!field.required) { if (!field.required) {
auto empty_value = auto empty_value =
opts.set_empty_to_null ? "0" : "_fbb.CreateSharedString(\"\")"; opts.set_empty_strings_to_null ? "0" : "_fbb.CreateSharedString(\"\")";
code = value + ".empty() ? " + empty_value + " : " + code; code = value + ".empty() ? " + empty_value + " : " + code;
} }
break; break;
...@@ -2557,10 +2557,10 @@ class CppGenerator : public BaseGenerator { ...@@ -2557,10 +2557,10 @@ class CppGenerator : public BaseGenerator {
} }
} }
// If set_empty_to_null option is enabled, for optional fields, check to // If set_empty_vectors_to_null option is enabled, for optional fields, check to
// see if there actually is any data in _o->field before attempting to // see if there actually is any data in _o->field before attempting to
// access it. // access it.
if (opts.set_empty_to_null && !field.required) { if (opts.set_empty_vectors_to_null && !field.required) {
code = value + ".size() ? " + code + " : 0"; code = value + ".size() ? " + code + " : 0";
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment