summaryrefslogtreecommitdiff
path: root/modules/codec
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-09 19:03:00 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-09 19:03:00 +0200
commit8f79cd24c91b5fb5d062a922ae38f14e09e17b1a (patch)
treefde0bc007852897d1720d6283ea9b970e867951d /modules/codec
parentdf2e8e4463c9bc348e672fd894250a9cd6e13cfa (diff)
wip
Diffstat (limited to 'modules/codec')
-rw-r--r--modules/codec/c++/transport.hpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp
index 1dbe038..bb5019c 100644
--- a/modules/codec/c++/transport.hpp
+++ b/modules/codec/c++/transport.hpp
@@ -19,7 +19,7 @@ template<typename T>
class transport;
template<uint64_t Len>
-class transport<trans::FixedLength<Len>> {
+class transport<trans::FixedLength<Len>> final {
private:
public:
error_or<buffer_view> view_slice(buffer& buff) const {
@@ -59,4 +59,53 @@ public:
return make_error<err::not_implemented>();
}
};
+
+template<uint64_t Len>
+class transport<trans::VarLength<Len>> final {
+public:
+ error_or<buffer_view> view_slice(buffer& buff) const {
+ typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type val{};
+ buffer_view view{buff};
+
+ auto eov = stream_value<schema::Primitive<schema::UnsignedInteger, Len>>::decode(val, view);
+ if(eov.is_error()){
+ return std::move(eov.get_error());
+ }
+
+ if(view.read_composite_length() < val){
+ return make_error<err::buffer_exhausted>();
+ }
+ buff.read_advance(Len);
+
+ buffer_view data_view{buff, val, 0u};
+ return data_view;
+ }
+
+ error_or<uint64_t> wrap(buffer& out_buff, buffer& in_buff){
+ using trans_type = typename native_data_type<schema::Primitive<schema::UnsignedInteger, Len>>::type;
+ trans_type len{};
+ len = static_cast<trans_type>(in_buff.read_composite_length());
+
+ {
+ auto err = out_buff.write_require_length(len);
+ if(err.failed()){
+ return err;
+ }
+ }
+
+ return make_error<err::not_implemented>();
+
+ for(uint8_t i = 0; i < in_buff.read_composite_length(); ++i){
+ uint8_t val = in_buff.read(i);
+ out_buff.write(i) = val;
+ }
+
+ return Len;
+ }
+
+ error_or<array_buffer> chain_slice(chain_array_buffer& buff) const {
+ (void) buff;
+ return make_error<err::not_implemented>();
+ }
+};
}