summaryrefslogtreecommitdiff
path: root/src/cbor/cbor_encoder.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2022-11-22 17:05:02 +1100
committerjacqueline <me@jacqueline.id.au>2022-11-22 17:05:02 +1100
commit9176ef187227ffb56c249c5f321cd1bf50d4cfcc (patch)
treea846c8fc4e5788e97d6fca43c2807c4bf0ae0214 /src/cbor/cbor_encoder.cpp
parent9f8cfaa7a8abd885785830e03d7c417e856b8a22 (diff)
downloadtangara-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.cpp53
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
+