summaryrefslogtreecommitdiff
path: root/upb/def.c
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2015-02-02 13:54:24 -0800
committerJoshua Haberman <jhaberman@gmail.com>2015-02-02 13:54:24 -0800
commit17be1ef0f246aa7add98c04efce3e0b992abccc4 (patch)
tree5ea54a02a338f2123503f840280a6e037cd65954 /upb/def.c
parent51513c6e7f9df3f04fde0ff94bfe654f8dccaaa0 (diff)
parentfb585045692c482b6946fff63f0cd8425c8c70b5 (diff)
Merge pull request #12 from cfallin/json-maps
Support maps in JSON parsing and serialization.
Diffstat (limited to 'upb/def.c')
-rw-r--r--upb/def.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/upb/def.c b/upb/def.c
index 3dba221..0963675 100644
--- a/upb/def.c
+++ b/upb/def.c
@@ -211,6 +211,21 @@ static bool upb_validate_field(upb_fielddef *f, upb_status *s) {
upb_fielddef_setdefaultint32(f, upb_fielddef_defaultint32(f));
}
+ // Ensure that MapEntry submessages only appear as repeated fields, not
+ // optional/required (singular) fields.
+ if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&
+ upb_fielddef_msgsubdef(f) != NULL) {
+ const upb_msgdef *subdef = upb_fielddef_msgsubdef(f);
+ if (upb_msgdef_mapentry(subdef) && !upb_fielddef_isseq(f)) {
+ upb_status_seterrf(s,
+ "Field %s refers to mapentry message but is not "
+ "a repeated field",
+ upb_fielddef_name(f) ? upb_fielddef_name(f) :
+ "(unnamed)");
+ return false;
+ }
+ }
+
return true;
}
@@ -1243,6 +1258,11 @@ bool upb_fielddef_isprimitive(const upb_fielddef *f) {
return !upb_fielddef_isstring(f) && !upb_fielddef_issubmsg(f);
}
+bool upb_fielddef_ismap(const upb_fielddef *f) {
+ return upb_fielddef_isseq(f) && upb_fielddef_issubmsg(f) &&
+ upb_msgdef_mapentry(upb_fielddef_msgsubdef(f));
+}
+
bool upb_fielddef_hassubdef(const upb_fielddef *f) {
return upb_fielddef_issubmsg(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback