Go to the documentation of this file.
35 #include <unordered_map>
36 #include <unordered_set>
52 #include <google/protobuf/port_def.inc>
59 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;
60 using std::placeholders::_1;
107 std::unique_ptr<BaseElement>
element(
120 if (
idx != std::string::npos) {
129 Status GetNanosFromStringPiece(StringPiece s_nanos,
130 const char* parse_failure_message,
131 const char* exceeded_limit_message,
136 int num_leading_zeros = 0;
137 while (s_nanos.Consume(
"0")) {
145 if (!s_nanos.empty() && !
safe_strto32(s_nanos, &i_nanos)) {
159 int32 scale = num_leading_zeros + s_nanos.size();
163 int32 conversion = 0;
166 conversion = 100000000;
169 conversion = 10000000;
172 conversion = 1000000;
194 exceeded_limit_message);
196 *nanos = i_nanos * conversion;
211 is_well_known_type_(
false),
212 well_known_type_render_(nullptr) {}
221 if (ow_ ==
nullptr) {
223 uninterpreted_events_.push_back(
Event(Event::START_OBJECT,
name));
224 }
else if (is_well_known_type_ && depth_ == 1) {
227 if (
name !=
"value" && !invalid_) {
228 parent_->InvalidValue(
"Any",
229 "Expect a \"value\" field for well-known types.");
232 ow_->StartObject(
"");
237 ow_->StartObject(
name);
243 if (ow_ ==
nullptr) {
246 uninterpreted_events_.push_back(
Event(Event::END_OBJECT));
248 }
else if (depth_ >= 0 || !is_well_known_type_) {
265 if (ow_ ==
nullptr) {
267 uninterpreted_events_.push_back(
Event(Event::START_LIST,
name));
268 }
else if (is_well_known_type_ && depth_ == 1) {
269 if (
name !=
"value" && !invalid_) {
270 parent_->InvalidValue(
"Any",
271 "Expect a \"value\" field for well-known types.");
276 ow_->StartList(
name);
283 GOOGLE_LOG(DFATAL) <<
"Mismatched EndList found, should not be possible";
286 if (ow_ ==
nullptr) {
288 uninterpreted_events_.push_back(
Event(Event::END_LIST));
298 if (depth_ == 0 && ow_ ==
nullptr &&
name ==
"@type") {
300 }
else if (ow_ ==
nullptr) {
303 }
else if (depth_ == 0 && is_well_known_type_) {
304 if (
name !=
"value" && !invalid_) {
305 parent_->InvalidValue(
"Any",
306 "Expect a \"value\" field for well-known types.");
309 if (well_known_type_render_ ==
nullptr) {
313 parent_->InvalidValue(
"Any",
"Expect a JSON object.");
317 ow_->ProtoWriter::StartObject(
"");
318 Status status = (*well_known_type_render_)(ow_.get(),
value);
319 if (!status.
ok()) ow_->InvalidValue(
"Any", status.
message());
320 ow_->ProtoWriter::EndObject();
335 parent_->InvalidValue(
"String",
s.status().message());
339 type_url_ =
s.ValueOrDie();
343 parent_->typeinfo()->ResolveTypeUrl(type_url_);
344 if (!resolved_type.
ok()) {
345 parent_->InvalidValue(
"Any", resolved_type.
status().message());
353 if (well_known_type_render_ !=
nullptr ||
357 is_well_known_type_ =
true;
375 if (!is_well_known_type_) {
376 ow_->StartObject(
"");
381 for (
int i = 0;
i < uninterpreted_events_.size(); ++
i) {
382 uninterpreted_events_[
i].Replay(
this);
387 if (ow_ ==
nullptr) {
388 if (uninterpreted_events_.empty()) {
395 parent_->InvalidValue(
"Any",
396 StrCat(
"Missing @type for any field in ",
397 parent_->master_type_.name()));
406 if (!
data_.empty()) {
426 case RENDER_DATA_PIECE:
440 value_storage_ =
value_.ToBytes().ValueOrDie();
447 ItemType item_type,
bool is_placeholder,
452 item_type_(item_type),
453 is_placeholder_(is_placeholder),
458 if (item_type ==
MAP) {
459 map_keys_.reset(
new std::unordered_set<std::string>);
464 ItemType item_type,
bool is_placeholder,
467 ow_(this->parent()->ow_),
469 item_type_(item_type),
470 is_placeholder_(is_placeholder),
472 if (item_type ==
ANY) {
475 if (item_type ==
MAP) {
476 map_keys_.reset(
new std::unordered_set<std::string>);
527 "Cannot start root message with ListValue.");
588 if (
field ==
nullptr)
return this;
636 if (
current_ ==
nullptr)
return this;
639 if (
current_->any()->EndObject())
return this;
736 if (
element() !=
nullptr &&
element()->parent_field() !=
nullptr) {
757 "') within a map."));
764 if (
element() !=
nullptr &&
element()->parent_field() !=
nullptr) {
795 if (
field ==
nullptr) {
867 if (
current_ ==
nullptr)
return this;
881 switch (
data.type()) {
888 if (int_value.
ok()) {
889 ow->ProtoWriter::RenderDataPiece(
895 struct_field_name =
"number_value";
903 if (int_value.
ok()) {
904 ow->ProtoWriter::RenderDataPiece(
910 struct_field_name =
"number_value";
916 if (double_value.
ok()) {
917 ow->ProtoWriter::RenderDataPiece(
923 struct_field_name =
"number_value";
927 struct_field_name =
"string_value";
931 struct_field_name =
"bool_value";
935 struct_field_name =
"null_value";
940 "Invalid struct data type. Only number, string, boolean or "
941 "null values are supported.");
944 ow->ProtoWriter::RenderDataPiece(struct_field_name,
data);
953 StrCat(
"Invalid data type for timestamp, value is ",
954 data.ValueAsStringOrDefault(
"")));
967 ow->ProtoWriter::RenderDataPiece(
"seconds",
DataPiece(seconds));
968 ow->ProtoWriter::RenderDataPiece(
"nanos",
DataPiece(nanos));
974 ow->ProtoWriter::RenderDataPiece(
984 StrCat(
"Invalid data type for field mask, value is ",
985 data.ValueAsStringOrDefault(
"")));
1000 StrCat(
"Invalid data type for duration, value is ",
1001 data.ValueAsStringOrDefault(
"")));
1008 "Illegal duration format; duration must end with 's'");
1018 SplitSecondsAndNanos(
value, &s_secs, &s_nanos);
1022 "Invalid duration format, failed to parse seconds");
1026 Status nanos_status = GetNanosFromStringPiece(
1027 s_nanos,
"Invalid duration format, failed to parse nano seconds",
1028 "Duration value exceeds limits", &nanos);
1029 if (!nanos_status.
ok()) {
1030 return nanos_status;
1032 nanos = sign * nanos;
1034 int64 seconds = sign * unsigned_seconds;
1038 "Duration value exceeds limits");
1041 ow->ProtoWriter::RenderDataPiece(
"seconds",
DataPiece(seconds));
1042 ow->ProtoWriter::RenderDataPiece(
"nanos",
DataPiece(nanos));
1049 ow->ProtoWriter::RenderDataPiece(
"value",
data);
1061 if (type_renderer ==
nullptr) {
1070 status = (*type_renderer)(
this,
data);
1089 if (
field ==
nullptr) {
1090 GOOGLE_LOG(DFATAL) <<
"Map does not have a value field.";
1110 if (type_renderer !=
nullptr) {
1116 status = (*type_renderer)(
this,
data);
1140 if (
field ==
nullptr)
return this;
1144 if (type_renderer !=
nullptr) {
1150 status = (*type_renderer)(
this,
data);
1173 std::unordered_map<std::string, ProtoStreamObjectWriter::TypeRenderer>*
1180 (*renderers_)[
"type.googleapis.com/google.protobuf.Timestamp"] =
1182 (*renderers_)[
"type.googleapis.com/google.protobuf.Duration"] =
1184 (*renderers_)[
"type.googleapis.com/google.protobuf.FieldMask"] =
1186 (*renderers_)[
"type.googleapis.com/google.protobuf.Double"] =
1188 (*renderers_)[
"type.googleapis.com/google.protobuf.Float"] =
1190 (*renderers_)[
"type.googleapis.com/google.protobuf.Int64"] =
1192 (*renderers_)[
"type.googleapis.com/google.protobuf.UInt64"] =
1194 (*renderers_)[
"type.googleapis.com/google.protobuf.Int32"] =
1196 (*renderers_)[
"type.googleapis.com/google.protobuf.UInt32"] =
1198 (*renderers_)[
"type.googleapis.com/google.protobuf.Bool"] =
1200 (*renderers_)[
"type.googleapis.com/google.protobuf.String"] =
1202 (*renderers_)[
"type.googleapis.com/google.protobuf.Bytes"] =
1204 (*renderers_)[
"type.googleapis.com/google.protobuf.DoubleValue"] =
1206 (*renderers_)[
"type.googleapis.com/google.protobuf.FloatValue"] =
1208 (*renderers_)[
"type.googleapis.com/google.protobuf.Int64Value"] =
1210 (*renderers_)[
"type.googleapis.com/google.protobuf.UInt64Value"] =
1212 (*renderers_)[
"type.googleapis.com/google.protobuf.Int32Value"] =
1214 (*renderers_)[
"type.googleapis.com/google.protobuf.UInt32Value"] =
1216 (*renderers_)[
"type.googleapis.com/google.protobuf.BoolValue"] =
1218 (*renderers_)[
"type.googleapis.com/google.protobuf.StringValue"] =
1220 (*renderers_)[
"type.googleapis.com/google.protobuf.BytesValue"] =
1222 (*renderers_)[
"type.googleapis.com/google.protobuf.Value"] =
1240 if (
current_ ==
nullptr)
return true;
1242 if (!
current_->InsertMapKeyIfNotPresent(unnormalized_name)) {
1245 StrCat(
"Repeated map key: '", unnormalized_name,
1246 "' is already set."));
1255 bool is_placeholder,
bool is_list) {
1261 new Item(
current_.release(), item_type, is_placeholder, is_list));
1281 if (
field.type_url().empty() ||
1283 field.cardinality() !=
ProtoWriter * EndList() override
ErrorListener * listener()
ProtoStreamObjectWriter(TypeResolver *type_resolver, const google::protobuf::Type &type, strings::ByteSink *output, ErrorListener *listener, const ProtoStreamObjectWriter::Options &options=ProtoStreamObjectWriter::Options::Defaults())
virtual void InvalidName(const LocationTrackerInterface &loc, StringPiece invalid_name, StringPiece message)=0
GLuint const GLchar * name
bool ignore_null_value_map_entry
const char kStructValueTypeUrl[]
ProtoWriter * StartList(StringPiece name) override
const Descriptor::ReservedRange value
ProtoWriter * EndObject() override
ProtoStreamObjectWriter * EndList() override
const LocationTrackerInterface & location()
string SimpleDtoa(double value)
ProtoElement * element() override
bool ValidMapKey(StringPiece unnormalized_name)
const StringPiece GetTypeWithoutUrl(StringPiece type_url)
const T & ValueOrDie() const
util::Status DecodeCompactFieldMaskPaths(StringPiece paths, PathSinkCallback path_sink)
bool safe_strto32(const string &str, int32 *value)
zend_class_entry * field_type
string StrCat(const AlphaNum &a, const AlphaNum &b)
const char kStructValueType[]
const Status & status() const
void InvalidName(StringPiece unknown_name, StringPiece message)
@ Field_Kind_TYPE_MESSAGE
void call_once(Args &&... args)
void set_ignore_unknown_fields(bool ignore_unknown_fields)
bool InsertMapKeyIfNotPresent(StringPiece map_key)
GLsizei const GLchar *const * string
ProtoStreamObjectWriter * EndObject() override
ProtoStreamObjectWriter * ow_
std::string ToSnakeCase(StringPiece input)
const int64 kDurationMaxSeconds
const int64 kDurationMinSeconds
virtual const google::protobuf::Type * GetTypeByTypeUrl(StringPiece type_url) const =0
static uint32_t idx(tarjan *t, const upb_refcounted *r)
static TypeRenderer * FindTypeRenderer(const std::string &type_url)
void OnShutdown(void(*func)())
static util::Status RenderDuration(ProtoStreamObjectWriter *ow, const DataPiece &value)
bool struct_integers_as_strings
void set_use_lower_camel_for_enums(bool use_lower_camel_for_enums)
ProtoStreamObjectWriter * StartObject(StringPiece name) override
static const size_type npos
bool use_lower_camel_for_enums
static util::Status RenderTimestamp(ProtoStreamObjectWriter *ow, const DataPiece &value)
const Collection::value_type::second_type * FindOrNull(const Collection &collection, const typename Collection::value_type::first_type &key)
const std::string GetFullTypeWithUrl(StringPiece simple_type)
void set_case_insensitive_enum_parsing(bool case_insensitive_enum_parsing)
void set_ignore_unknown_enum_values(bool ignore_unknown_enum_values)
void Replay(AnyWriter *writer) const
GLsizei const GLchar ** path
const google::protobuf::Type & master_type_
static PyObject * Item(PyObject *pself, Py_ssize_t index)
void DecrementInvalidDepth()
bool IsMap(const google::protobuf::Field &field)
static void DeleteRendererMap()
bool IsMap(const google::protobuf::Field &field, const google::protobuf::Type &type)
#define GOOGLE_LOG(LEVEL)
const char kStructListValueType[]
AnyWriter(ProtoStreamObjectWriter *parent)
@ Field_Cardinality_CARDINALITY_REPEATED
void IncrementInvalidDepth()
bool IsAny(const google::protobuf::Field &field)
bool ParseTime(const string &value, int64 *seconds, int32 *nanos)
util::Status(* TypeRenderer)(ProtoStreamObjectWriter *, const DataPiece &)
bool HasPrefixString(const string &str, const string &prefix)
ProtoStreamObjectWriter * StartList(StringPiece name) override
const FieldDescriptor * field
const google::protobuf::Field * BeginNamed(StringPiece name, bool is_list)
static util::Status RenderFieldMask(ProtoStreamObjectWriter *ow, const DataPiece &value)
static std::unordered_map< std::string, TypeRenderer > * renderers_
virtual ProtoWriter * RenderDataPiece(StringPiece name, const DataPiece &value)
bool IsStruct(const google::protobuf::Field &field)
Status
Status of any operation that the TOF sdk performs.
void RenderDataPiece(StringPiece name, const DataPiece &value)
bool ignore_unknown_fields
ProtoStreamObjectWriter * RenderDataPiece(StringPiece name, const DataPiece &data) override
static util::Status RenderWrapperType(ProtoStreamObjectWriter *ow, const DataPiece &value)
bool use_strict_base64_decoding() const
const TypeInfo * typeinfo()
bool IsStructListValue(const google::protobuf::Field &field)
strings::ByteSink * output_
void Push(StringPiece name, Item::ItemType item_type, bool is_placeholder, bool is_list)
PROTOBUF_NAMESPACE_ID::internal::once_flag writer_renderers_init_
StringPiece message() const
bool ignore_unknown_enum_values
std::unique_ptr< AnyWriter > any_
void StartList(StringPiece name)
std::string ConvertFieldMaskPath(const StringPiece path, ConverterCallback converter)
ProtoWriter * StartObject(StringPiece name) override
static util::Status RenderStructValue(ProtoStreamObjectWriter *ow, const DataPiece &value)
bool IsRepeated(const google::protobuf::Field &field)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static void InitRendererMap()
void StartAny(const DataPiece &value)
void InvalidValue(StringPiece type_name, StringPiece value)
Item(ProtoStreamObjectWriter *enclosing, ItemType item_type, bool is_placeholder, bool is_list)
const int32 kNanosPerSecond
bool HasSuffixString(const string &str, const string &suffix)
static util::Status RenderOneFieldPath(ProtoStreamObjectWriter *ow, StringPiece path)
bool IsStructValue(const google::protobuf::Field &field)
bool case_insensitive_enum_parsing
GLsizei const GLfloat * value
const upb_json_parsermethod const upb_symtab upb_sink * output
bool safe_strtou64(const string &str, uint64 *value)
std::unique_ptr< std::unordered_set< std::string > > map_keys_
void StartObject(StringPiece name)
std::unique_ptr< Item > current_
~ProtoStreamObjectWriter() override
const char kStructNullValueTypeUrl[]
const ProtoStreamObjectWriter::Options options_
bool InsertIfNotPresent(Collection *const collection, const typename Collection::value_type &vt)
const google::protobuf::Field * Lookup(StringPiece name)
DebugStringOptions options_
void StrAppend(string *result, const AlphaNum &a)
libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58