diff options
| author | jacqueline <me@jacqueline.id.au> | 2022-11-22 17:05:02 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2022-11-22 17:05:02 +1100 |
| commit | 9176ef187227ffb56c249c5f321cd1bf50d4cfcc (patch) | |
| tree | a846c8fc4e5788e97d6fca43c2807c4bf0ae0214 /src/cbor/cbor_encoder.cpp | |
| parent | 9f8cfaa7a8abd885785830e03d7c417e856b8a22 (diff) | |
| download | tangara-fw-9176ef187227ffb56c249c5f321cd1bf50d4cfcc.tar.gz | |
Add cbor wrapper, and chunk streaming util
Diffstat (limited to 'src/cbor/cbor_encoder.cpp')
| -rw-r--r-- | src/cbor/cbor_encoder.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cbor/cbor_encoder.cpp b/src/cbor/cbor_encoder.cpp new file mode 100644 index 00000000..863597b4 --- /dev/null +++ b/src/cbor/cbor_encoder.cpp @@ -0,0 +1,53 @@ +#include "cbor_encoder.hpp" +#include <cstdint> +#include "esp-idf/components/cbor/tinycbor/src/cbor.h" + +namespace cbor { + + static const int kEncoderFlags = 0; + +Encoder::Encoder(ContainerType type, uint32_t container_len, uint8_t *buffer, size_t buffer_len) { + cbor_encoder_init(&root_encoder, buffer, buffer_len, kEncoderFlags); + switch (type) { + case CONTAINER_ARRAY: + error_ = cbor_encoder_create_array(&encoder, &container_encoder_, container_len); + break; + case CONTAINER_MAP: + error_ = cbor_encoder_create_map(&encoder, &container_encoder_, container_len); + break; + } +} + +auto Encoder::WriteString(const std::string &val) -> void { + if (error_ != CborNoError) { + return; + } + error_ = cbor_encode_byte_string(&container_encoder_, val.c_str(), val.size()); +} + +auto Encoder::WriteUnsigned(uint32_t val) -> void { + if (error_ != CborNoError) { + return; + } + error_ = cbor_encode_uint(&container_encoder_, val); +} + +auto Encoder::WriteSigned(int32_t val) -> void { + if (error_ != CborNoError) { + return; + } + error_ = cbor_encode_int(&container_encoder_, val); +} + +auto Encoder::Finish() -> cpp::result<size_t, CborError> { + if (error_ != CborNoError) { + return cpp::fail(error_); + } + if (CborError final_error = cbor_encoder_close_container(&root_encoder, &container_encoder_) != CborNoError) { + return cpp::fail(final_error); + } + return cbor_encoder_get_buffer_size(&root_encoder); +} + +} // namespace cbor + |
