|
|
|
@ -861,6 +861,7 @@ static upb_MessageValue jsondec_bool(jsondec* d, const upb_FieldDef* f) { |
|
|
|
|
/* Composite types (array/message/map) ****************************************/ |
|
|
|
|
|
|
|
|
|
static void jsondec_array(jsondec* d, upb_Message* msg, const upb_FieldDef* f) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_Array* arr = upb_Message_Mutable(msg, f, d->arena).array; |
|
|
|
|
|
|
|
|
|
jsondec_arrstart(d); |
|
|
|
@ -874,6 +875,7 @@ static void jsondec_array(jsondec* d, upb_Message* msg, const upb_FieldDef* f) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_Map* map = upb_Message_Mutable(msg, f, d->arena).map; |
|
|
|
|
const upb_MessageDef* entry = upb_FieldDef_MessageSubDef(f); |
|
|
|
|
const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry, 1); |
|
|
|
@ -895,6 +897,7 @@ static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) { |
|
|
|
|
|
|
|
|
|
static void jsondec_tomsg(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) { |
|
|
|
|
jsondec_object(d, msg, m); |
|
|
|
|
} else { |
|
|
|
@ -915,6 +918,7 @@ static upb_MessageValue jsondec_msg(jsondec* d, const upb_FieldDef* f) { |
|
|
|
|
|
|
|
|
|
static void jsondec_field(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_StringView name; |
|
|
|
|
const upb_FieldDef* f; |
|
|
|
|
const upb_FieldDef* preserved; |
|
|
|
@ -980,6 +984,7 @@ static void jsondec_field(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_object(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
jsondec_objstart(d); |
|
|
|
|
while (jsondec_objnext(d)) { |
|
|
|
|
jsondec_field(d, msg, m); |
|
|
|
@ -1080,6 +1085,7 @@ static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) { |
|
|
|
|
|
|
|
|
|
static void jsondec_timestamp(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_MessageValue seconds; |
|
|
|
|
upb_MessageValue nanos; |
|
|
|
|
upb_StringView str = jsondec_string(d); |
|
|
|
@ -1145,6 +1151,7 @@ malformed: |
|
|
|
|
|
|
|
|
|
static void jsondec_duration(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_MessageValue seconds; |
|
|
|
|
upb_MessageValue nanos; |
|
|
|
|
upb_StringView str = jsondec_string(d); |
|
|
|
@ -1177,6 +1184,7 @@ static void jsondec_duration(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_listvalue(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
const upb_FieldDef* values_f = upb_MessageDef_FindFieldByNumber(m, 1); |
|
|
|
|
const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(values_f); |
|
|
|
|
const upb_MiniTable* value_layout = upb_MessageDef_MiniTable(value_m); |
|
|
|
@ -1195,6 +1203,7 @@ static void jsondec_listvalue(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_struct(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
const upb_FieldDef* fields_f = upb_MessageDef_FindFieldByNumber(m, 1); |
|
|
|
|
const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(fields_f); |
|
|
|
|
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(entry_m, 2); |
|
|
|
@ -1217,6 +1226,7 @@ static void jsondec_struct(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_wellknownvalue(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
upb_MessageValue val; |
|
|
|
|
const upb_FieldDef* f; |
|
|
|
|
upb_Message* submsg; |
|
|
|
@ -1305,6 +1315,7 @@ static upb_StringView jsondec_mask(jsondec* d, const char* buf, |
|
|
|
|
|
|
|
|
|
static void jsondec_fieldmask(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
/* repeated string paths = 1; */ |
|
|
|
|
const upb_FieldDef* paths_f = upb_MessageDef_FindFieldByNumber(m, 1); |
|
|
|
|
upb_Array* arr = upb_Message_Mutable(msg, paths_f, d->arena).array; |
|
|
|
@ -1328,6 +1339,7 @@ static void jsondec_fieldmask(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_anyfield(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) { |
|
|
|
|
/* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
|
|
|
|
|
* where f1, f2, etc. are the normal fields of this type. */ |
|
|
|
@ -1346,6 +1358,7 @@ static void jsondec_anyfield(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static const upb_MessageDef* jsondec_typeurl(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
const upb_FieldDef* type_url_f = upb_MessageDef_FindFieldByNumber(m, 1); |
|
|
|
|
const upb_MessageDef* type_m; |
|
|
|
|
upb_StringView type_url = jsondec_string(d); |
|
|
|
@ -1375,6 +1388,7 @@ static const upb_MessageDef* jsondec_typeurl(jsondec* d, upb_Message* msg, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void jsondec_any(jsondec* d, upb_Message* msg, const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
/* string type_url = 1;
|
|
|
|
|
* bytes value = 2; */ |
|
|
|
|
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 2); |
|
|
|
@ -1443,6 +1457,7 @@ static void jsondec_any(jsondec* d, upb_Message* msg, const upb_MessageDef* m) { |
|
|
|
|
|
|
|
|
|
static void jsondec_wrapper(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 1); |
|
|
|
|
upb_JsonMessageValue val = jsondec_value(d, value_f); |
|
|
|
|
UPB_ASSUME(val.ignore == false); // Wrapper cannot be an enum.
|
|
|
|
@ -1451,6 +1466,7 @@ static void jsondec_wrapper(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static void jsondec_wellknown(jsondec* d, upb_Message* msg, |
|
|
|
|
const upb_MessageDef* m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
switch (upb_MessageDef_WellKnownType(m)) { |
|
|
|
|
case kUpb_WellKnown_Any: |
|
|
|
|
jsondec_any(d, msg, m); |
|
|
|
@ -1491,6 +1507,7 @@ static void jsondec_wellknown(jsondec* d, upb_Message* msg, |
|
|
|
|
|
|
|
|
|
static bool upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg, |
|
|
|
|
const upb_MessageDef* const m) { |
|
|
|
|
UPB_ASSERT(!upb_Message_IsFrozen(msg)); |
|
|
|
|
if (UPB_SETJMP(d->err)) return false; |
|
|
|
|
|
|
|
|
|
jsondec_tomsg(d, msg, m); |
|
|
|
|