summaryrefslogtreecommitdiff
path: root/modules/codec/c++/transport.hpp
blob: 1dbe0386ede9aa707615c17c6f8d25c78343f7aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#pragma once

#include <forstio/buffer.hpp>
#include "data.hpp"

namespace saw {
namespace trans {
template<uint64_t Len = 8u>
struct FixedLength {};

template<uint64_t Len = 8u>
struct VarLength {};

struct NewLine {};
struct CarriageReturnNewLine {};
}

template<typename T>
class transport;

template<uint64_t Len>
class transport<trans::FixedLength<Len>> {
private:
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 val{};
		val = static_cast<trans_type>(in_buff.read_composite_length());

		auto eov = stream_value<schema::Primitive<schema::UnsignedInteger, Len>>::encode(val, out_buff);
		if(eov.is_error()){
			auto& err = eov.get_error();
			return std::move(err);
		}

		return Len;
	}

	error_or<array_buffer> chain_slice(chain_array_buffer& buff) const {
		(void) buff;
		return make_error<err::not_implemented>();
	}
};
}