summaryrefslogtreecommitdiff
path: root/src/cbor_wrapper/cbor_encoder.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2022-12-02 13:39:00 +1100
committerjacqueline <me@jacqueline.id.au>2022-12-02 13:39:00 +1100
commit222c810b07ffc635fc7908d121e97e4d65ccc5c8 (patch)
tree91c7b5c72a11770ebf3695bf0c234597b2bc419d /src/cbor_wrapper/cbor_encoder.cpp
parent71a4f5166f5491dc0982a18d62c63e28b3a52faa (diff)
downloadtangara-fw-222c810b07ffc635fc7908d121e97e4d65ccc5c8.tar.gz
fix build errors
Diffstat (limited to 'src/cbor_wrapper/cbor_encoder.cpp')
-rw-r--r--src/cbor_wrapper/cbor_encoder.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/cbor_wrapper/cbor_encoder.cpp b/src/cbor_wrapper/cbor_encoder.cpp
new file mode 100644
index 00000000..e4e8ee84
--- /dev/null
+++ b/src/cbor_wrapper/cbor_encoder.cpp
@@ -0,0 +1,63 @@
+#include "cbor_encoder.hpp"
+
+#include <cstdint>
+#include <string>
+
+#include "cbor.h"
+#include "cbor_decoder.hpp"
+#include "result.hpp"
+
+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(&root_encoder_, &container_encoder_,
+ container_len);
+ break;
+ case CONTAINER_MAP:
+ error_ = cbor_encoder_create_map(&root_encoder_, &container_encoder_,
+ container_len);
+ break;
+ }
+}
+
+auto Encoder::WriteValue(const std::string& val) -> void {
+ if (error_ != CborNoError) {
+ return;
+ }
+ error_ =
+ cbor_encode_text_string(&container_encoder_, val.c_str(), val.size());
+}
+
+auto Encoder::WriteValue(uint32_t val) -> void {
+ if (error_ != CborNoError) {
+ return;
+ }
+ error_ = cbor_encode_uint(&container_encoder_, val);
+}
+
+auto Encoder::WriteValue(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) {
+ error_ = cbor_encoder_close_container(&root_encoder_, &container_encoder_);
+ }
+ if (error_ != CborNoError) {
+ return cpp::fail(error_);
+ }
+ return cbor_encoder_get_buffer_size(&root_encoder_, buffer_);
+}
+
+} // namespace cbor