[Yunq] POC for moving yunq parsing to a library.

This commit is contained in:
Drew Galbraith 2024-01-11 19:27:57 -08:00
parent 8a711266ef
commit 9e9ef21a3d
8 changed files with 125 additions and 59 deletions

View file

@ -1,4 +1,5 @@
set(yunq_files
message_view.cpp
serialize.cpp
)

19
lib/yunq/message_view.cpp Normal file
View file

@ -0,0 +1,19 @@
#include "message_view.h"
namespace yunq {
template <>
glcr::ErrorOr<uint64_t> MessageView::ReadField<uint64_t>(uint64_t field_index) {
return buffer_.At<uint64_t>(field_offset(field_index));
}
template <>
glcr::ErrorOr<glcr::String> MessageView::ReadField<glcr::String>(
uint64_t field_index) {
ExtensionPointer ptr =
buffer_.At<ExtensionPointer>(field_offset(field_index));
return buffer_.StringAt(offset_ + ptr.offset, ptr.length);
}
} // namespace yunq

40
lib/yunq/message_view.h Normal file
View file

@ -0,0 +1,40 @@
#pragma once
#include <glacier/buffer/byte_buffer.h>
#include <glacier/status/error_or.h>
namespace yunq {
const uint64_t kHeaderSize = 24; // 4x uint32, 1x uint64
struct ExtensionPointer {
uint32_t offset;
uint32_t length;
};
class MessageView {
public:
MessageView(const glcr::ByteBuffer& buffer, uint64_t offset)
: buffer_(buffer), offset_(offset) {}
// TODO: Implement glcr::StatusOr
template <typename T>
glcr::ErrorOr<T> ReadField(uint64_t field_index);
private:
const glcr::ByteBuffer& buffer_;
uint64_t offset_;
uint64_t field_offset(uint64_t field_index) {
return offset_ + kHeaderSize + (8 * field_index);
}
};
template <>
glcr::ErrorOr<uint64_t> MessageView::ReadField<uint64_t>(uint64_t field_index);
template <>
glcr::ErrorOr<glcr::String> MessageView::ReadField<glcr::String>(
uint64_t field_index);
} // namespace yunq