23#include "pw_assert/check.h"
24#include "pw_protobuf/internal/proto_integer_base.h"
25#include "pw_protobuf/stream_decoder.h"
26#include "pw_status/status.h"
27#include "pw_status/try.h"
28#include "pw_stream/interval_reader.h"
29#include "pw_stream/stream.h"
31namespace pw::protobuf {
41class Uint32 :
public internal::ProtoIntegerBase<uint32_t> {
43 using ProtoIntegerBase<uint32_t>::ProtoIntegerBase;
46class Int32 :
public internal::ProtoIntegerBase<int32_t> {
48 using ProtoIntegerBase<int32_t>::ProtoIntegerBase;
51class Sint32 :
public internal::ProtoIntegerBase<int32_t> {
53 using ProtoIntegerBase<int32_t>::ProtoIntegerBase;
56class Fixed32 :
public internal::ProtoIntegerBase<uint32_t> {
58 using ProtoIntegerBase<uint32_t>::ProtoIntegerBase;
61class Sfixed32 :
public internal::ProtoIntegerBase<int32_t> {
63 using ProtoIntegerBase<int32_t>::ProtoIntegerBase;
66class Uint64 :
public internal::ProtoIntegerBase<uint64_t> {
68 using ProtoIntegerBase<uint64_t>::ProtoIntegerBase;
71class Int64 :
public internal::ProtoIntegerBase<int64_t> {
73 using ProtoIntegerBase<int64_t>::ProtoIntegerBase;
76class Sint64 :
public internal::ProtoIntegerBase<int64_t> {
78 using ProtoIntegerBase<int64_t>::ProtoIntegerBase;
81class Fixed64 :
public internal::ProtoIntegerBase<uint64_t> {
83 using ProtoIntegerBase<uint64_t>::ProtoIntegerBase;
86class Sfixed64 :
public internal::ProtoIntegerBase<int64_t> {
88 using ProtoIntegerBase<int64_t>::ProtoIntegerBase;
91class Float :
public internal::ProtoIntegerBase<float> {
93 using ProtoIntegerBase<
float>::ProtoIntegerBase;
96class Double :
public internal::ProtoIntegerBase<double> {
98 using ProtoIntegerBase<
double>::ProtoIntegerBase;
101class Bool :
public internal::ProtoIntegerBase<bool> {
103 using ProtoIntegerBase<
bool>::ProtoIntegerBase;
118 bool ok() {
return reader_.ok(); }
119 Status status() {
return reader_.status(); }
143template <
typename FieldType>
145template <
typename FieldType>
147template <
typename FieldType>
256 uint32_t field_number() {
return field_number_; }
258 bool ok() {
return field_reader_.ok(); }
259 Status status() {
return field_reader_.status(); }
265 template <
typename FieldType>
267 if (!field_reader_.ok()) {
268 return FieldType(field_reader_.status());
274 decoder.GetLengthDelimitedPayloadBounds();
275 PW_TRY(payload_bounds.status());
279 field_reader_.source_reader(),
280 payload_bounds.value().low + field_reader_.start(),
281 payload_bounds.value().high + field_reader_.start()));
286 Field(
Status status) : field_reader_(status), field_number_(0) {}
288 : field_reader_(std::move(reader)), field_number_(field_number) {}
291 uint32_t field_number_;
306 bool ok() {
return status_.
ok(); }
307 Status status() {
return status_; }
308 Field operator*() {
return current_; }
309 Field* operator->() {
return ¤t_; }
310 bool operator!=(
const iterator& other)
const {
return !(*
this == other); }
312 bool operator==(
const iterator& other)
const {
313 return eof_ == other.eof_ && reader_ == other.reader_;
323 : reader_(std::move(reader)), status_(reader_.status()) {
334 : reader_(proto_source, 0, size) {}
337 Bytes AsBytes(uint32_t field_number) {
return As<Bytes>(field_number); }
340 String AsString(uint32_t field_number) {
return As<String>(field_number); }
344 Int32 AsInt32(uint32_t field_number) {
return As<Int32>(field_number); }
345 Sint32 AsSint32(uint32_t field_number) {
return As<Sint32>(field_number); }
346 Uint32 AsUint32(uint32_t field_number) {
return As<Uint32>(field_number); }
347 Fixed32 AsFixed32(uint32_t field_number) {
return As<Fixed32>(field_number); }
348 Int64 AsInt64(uint32_t field_number) {
return As<Int64>(field_number); }
349 Sint64 AsSint64(uint32_t field_number) {
return As<Sint64>(field_number); }
350 Uint64 AsUint64(uint32_t field_number) {
return As<Uint64>(field_number); }
351 Fixed64 AsFixed64(uint32_t field_number) {
return As<Fixed64>(field_number); }
353 Sfixed32 AsSfixed32(uint32_t field_number) {
354 return As<Sfixed32>(field_number);
357 Sfixed64 AsSfixed64(uint32_t field_number) {
358 return As<Sfixed64>(field_number);
361 Float AsFloat(uint32_t field_number) {
return As<Float>(field_number); }
362 Double AsDouble(uint32_t field_number) {
return As<Double>(field_number); }
364 Bool AsBool(uint32_t field_number) {
return As<Bool>(field_number); }
368 Message AsMessage(uint32_t field_number) {
return As<Message>(field_number); }
372 RepeatedBytes AsRepeatedBytes(uint32_t field_number);
376 RepeatedStrings AsRepeatedStrings(uint32_t field_number);
380 RepeatedMessages AsRepeatedMessages(uint32_t field_number);
384 StringToMessageMap AsStringToMessageMap(uint32_t field_number);
388 StringToBytesMap AsStringToBytesMap(uint32_t field_number);
392 StringToStringMap AsStringToStringMap(uint32_t field_number);
397 Bytes ToBytes() {
return Bytes(reader_.Reset()); }
399 bool ok() {
return reader_.ok(); }
400 Status status() {
return reader_.status(); }
415 template <
typename FieldType>
416 FieldType As(uint32_t field_number) {
417 for (Field field : *
this) {
418 if (field.field_number() == field_number) {
419 return field.As<FieldType>();
426 template <
typename FieldType>
427 RepeatedFieldParser<FieldType> AsRepeated(uint32_t field_number) {
428 return RepeatedFieldParser<FieldType>(*
this, field_number);
431 template <
typename FieldParser>
432 StringMapParser<FieldParser> AsStringMap(uint32_t field_number) {
433 return StringMapParser<FieldParser>(*
this, field_number);
437 stream::IntervalReader reader_;
444 static Status ConsumeCurrentField(StreamDecoder& decoder) {
445 return decoder.field_consumed_ ?
OkStatus() : decoder.SkipField();
451Uint32 Message::Field::As<Uint32>();
454Int32 Message::Field::As<Int32>();
457Sint32 Message::Field::As<Sint32>();
460Fixed32 Message::Field::As<Fixed32>();
463Sfixed32 Message::Field::As<Sfixed32>();
466Uint64 Message::Field::As<Uint64>();
469Int64 Message::Field::As<Int64>();
472Sint64 Message::Field::As<Sint64>();
475Fixed64 Message::Field::As<Fixed64>();
478Sfixed64 Message::Field::As<Sfixed64>();
481Float Message::Field::As<Float>();
484Double Message::Field::As<Double>();
487Bool Message::Field::As<Bool>();
494template <
typename FieldType>
512 bool ok() {
return iter_.ok(); }
513 Status status() {
return iter_.status(); }
514 FieldType operator*() {
return current_; }
515 FieldType* operator->() {
return ¤t_; }
516 bool operator!=(
const iterator& other)
const {
return !(*
this == other); }
517 bool operator==(
const iterator& other)
const {
518 return &host_ == &other.host_ && iter_ == other.iter_;
528 iter_(std::move(init_iter)),
536 for (; iter_ != host_.message_.end(); ++iter_) {
537 if (!iter_.ok() || iter_->field_number() == host_.field_number_) {
538 current_ = iter_->As<FieldType>();
550 : message_(message), field_number_(field_number) {}
554 bool ok() {
return message_.ok(); }
555 Status status() {
return message_.status(); }
557 iterator begin() {
return iterator(*
this, message_.begin()); }
558 iterator end() {
return iterator(*
this, message_.end()); }
562 uint32_t field_number_ = 0;
576template <
typename ValueParser>
579 bool ok() {
return entry_.ok(); }
580 Status status() {
return entry_.status(); }
583 String Key() {
return entry_.AsString(kMapKeyFieldNumber); }
584 ValueParser Value() {
return entry_.As<ValueParser>(kMapValueFieldNumber); }
587 static constexpr uint32_t kMapKeyFieldNumber = 1;
588 static constexpr uint32_t kMapValueFieldNumber = 2;
598template <
typename ValueParser>
606 ValueParser operator[](std::string_view target) {
615 if (cmp_res.value()) {
616 return entry.Value();
constexpr bool ok() const
Definition: status.h:214
static constexpr Status Unavailable()
Requested operation can’t finish now, but may at a later time.
Definition: status.h:187
static constexpr Status NotFound()
The entity that the caller requested (e.g. file or directory) is not found.
Definition: status.h:141
Definition: message.h:101
Definition: message.h:111
Definition: message.h:254
Definition: message.h:296
Definition: message.h:252
Definition: message.h:497
Definition: message.h:495
Definition: stream_decoder.h:69
Definition: message.h:134
Definition: message.h:577
Definition: message.h:600
Definition: interval_reader.h:36
#define PW_TRY(expr)
Returns early if expr is a non-OK Status or Result.
Definition: try.h:27
constexpr Status OkStatus()
Definition: status.h:297