getMessageDest(field->message_type(), fieldDest);
}
+// Converts Destination to a string.
+static inline string getDestString(const Destination dest) {
+ switch (dest) {
+ case DEST_AUTOMATIC: return "AUTOMATIC";
+ case DEST_LOCAL: return "LOCAL";
+ case DEST_EXPLICIT: return "EXPLICIT";
+ // UNSET is considered EXPLICIT by default.
+ case DEST_UNSET: return "EXPLICIT";
+ default: return "UNKNOWN";
+ }
+}
+
// Get Names ===========================================================================================
static inline string getFieldName(const FieldDescriptor* field) {
// replace . with double underscores to avoid name conflicts since fields use snake naming convention
// IsDefault ============================================================================================
// Returns true if a field is default. Default is defined as this field has same dest as its containing message.
-// For message fields, it only looks at its field tag and own default mesaage tag, doesn't recursively go deeper.
+// For message fields, it only looks at its field tag and own default message tag, doesn't recursively go deeper.
static inline bool isDefaultField(const FieldDescriptor* field, const Destination containerDest) {
Destination fieldDest = getFieldDest(field);
if (field->type() != FieldDescriptor::TYPE_MESSAGE) {
return result;
}
-static void generateCsv(Descriptor const* descriptor, const string& indent, set<string>* parents) {
+static void generateCsv(Descriptor const* descriptor, const string& indent, set<string>* parents, const Destination containerDest = DEST_UNSET) {
DebugStringOptions options;
options.include_comments = true;
for (int i=0; i<descriptor->field_count(); i++) {
const FieldDescriptor* field = descriptor->field(i);
+ const Destination fieldDest = getFieldDest(field);
stringstream text;
if (field->type() == FieldDescriptor::TYPE_MESSAGE) {
text << field->message_type()->name();
text << field->type_name();
}
text << " " << field->name();
+ text << " (PRIVACY=";
+ if (isDefaultField(field, containerDest)) {
+ text << getDestString(containerDest);
+ } else {
+ text << getDestString(fieldDest);
+ }
+ text << ")";
printf("%s%s,\n", indent.c_str(), replace_string(text.str(), '\n', ' ').c_str());
if (field->type() == FieldDescriptor::TYPE_MESSAGE &&
parents->find(field->message_type()->full_name()) == parents->end()) {
parents->insert(field->message_type()->full_name());
- generateCsv(field->message_type(), indent + ",", parents);
+ generateCsv(field->message_type(), indent + ",", parents, fieldDest);
parents->erase(field->message_type()->full_name());
}
}
|| field->number() == sectionId) {
set<string> parents;
printf("%s\n", field->name().c_str());
- generateCsv(field->message_type(), "", &parents);
+ generateCsv(field->message_type(), "", &parents, getFieldDest(field));
break;
}
}