[Yunq] Add support for nested fields in messages.

This commit is contained in:
Drew Galbraith 2024-01-11 21:32:08 -08:00
parent 9e12531651
commit a48d63a664
18 changed files with 257 additions and 219 deletions

View file

@ -28,6 +28,9 @@ class MessageView {
glcr::ErrorOr<uint64_t> ReadCapability(uint64_t field_index,
const glcr::CapBuffer& caps) const;
template <typename T>
glcr::Status ReadMessage(uint64_t field_index, T& message) const;
private:
const glcr::ByteBuffer& buffer_;
uint64_t offset_;
@ -49,4 +52,13 @@ template <>
glcr::ErrorOr<glcr::Vector<uint64_t>> MessageView::ReadRepeated<uint64_t>(
uint64_t field_index) const;
template <typename T>
glcr::Status MessageView::ReadMessage(uint64_t field_index, T& message) const {
ExtensionPointer ptr =
buffer_.At<ExtensionPointer>(field_offset(field_index));
MessageView subview(buffer_, offset_ + ptr.offset);
return message.ParseFromBytes(subview);
}
} // namespace yunq

View file

@ -38,6 +38,9 @@ class Serializer {
void WriteRepeatedCapability(uint64_t field_index,
const glcr::Vector<uint64_t>& value);
template <typename T>
void WriteMessage(uint64_t field_index, const T& value);
void WriteHeader();
uint64_t size() const { return next_extension_; }
@ -67,4 +70,24 @@ template <>
void Serializer::WriteRepeated<uint64_t>(uint64_t field_index,
const glcr::Vector<uint64_t>& value);
template <typename T>
void Serializer::WriteMessage(uint64_t field_index, const T& value) {
uint64_t length = 0;
if (caps_) {
length = value.SerializeToBytes(buffer_, offset_ + next_extension_,
caps_.value().get());
} else {
length = value.SerializeToBytes(buffer_, offset_ + next_extension_);
}
ExtensionPointer ptr{
.offset = (uint32_t)next_extension_,
.length = (uint32_t)length,
};
next_extension_ += length;
buffer_.WriteAt<ExtensionPointer>(field_offset(field_index), ptr);
}
} // namespace yunq