From 24d06051231a28ba75bd45fbc792dd4f2e30fddd Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Mon, 8 Jan 2024 20:45:54 +0100 Subject: codec: Dangling csv changes --- modules/codec/c++/csv.h | 140 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 127 insertions(+), 13 deletions(-) (limited to 'modules') diff --git a/modules/codec/c++/csv.h b/modules/codec/c++/csv.h index 1664c31..7a3a18e 100644 --- a/modules/codec/c++/csv.h +++ b/modules/codec/c++/csv.h @@ -1,8 +1,10 @@ #pragma once #include +#include #include "data.h" +#include "stream_value.h" namespace saw { namespace encode { @@ -23,7 +25,7 @@ struct csv_encode, FromDecode> { using Schema = schema::Array; - static error_or encode(const data& from, data& to){ + static error_or encode(const data& from, buffer& to){ if constexpr (is_struct::value){ auto eov = csv_encode::encode_header(to); if(eov.is_error()){ @@ -46,14 +48,96 @@ template struct csv_encode...>, FromDecode> { using Schema = schema::Struct...>; - static error_or encode_header(const data& to){ - return make_error(); + template + static error_or encode_header_i(buffer& to){ + // Encode string + // + constexpr auto str_view = parameter_key_pack_type::literal; + + for(auto& iter : str_view.view()){ + auto eov = stream_value::encode(iter, to); + if(eov.is_error()){ + return eov; + } + } + + // Go to next string + if constexpr ( (i+1) < sizeof...(K)){ + /** + * Replace this with col separator + */ + constexpr std::string_view lit = ","; + for(int8_t iter : lit){ + auto eov = stream_value::encode(iter, to); + if(eov.is_error()){ + return eov; + } + } + return encode_header_i(to); + } + + { + /** + * Replace this with row separator + */ + constexpr std::string_view lit = "\r\n"; + for(int8_t iter : lit){ + auto eov = stream_value::encode(iter, to); + if ( eov.is_error()){ + return eov; + } + } + } + + return make_void(); } - static error_or encode(const data& from, data& to){ - + static error_or encode_header(buffer& to){ + return encode_header_i<0>(to); + } - return make_error(); + template + static error_or encode_i(const data& from, buffer& to){ + constexpr auto str_view = parameter_key_pack_type::literal; + + { + auto eov = csv_encode::type, FromDecode>::encode(from.template get(), to); + if(eov.is_error()){ + return eov; + } + } + + if constexpr ( (i+1) < sizeof...(K)){ + /** + * Replace this with col separator + */ + constexpr std::string_view lit = ","; + for(int8_t iter : lit){ + auto eov = stream_value::encode(iter, to); + if(eov.is_error()){ + return eov; + } + } + return encode_header(to); + } + { + /** + * Replace this with row separator + */ + constexpr std::string_view lit = "\r\n"; + for(int8_t iter : lit){ + auto eov = stream_value::encode(iter, to); + if ( eov.is_error()){ + return eov; + } + } + } + + return make_void(); + } + + static error_or encode(const data& from, buffer& to){ + return encode_i<0>(from, to); } }; @@ -61,9 +145,14 @@ template struct csv_encode { using Schema = schema::String; - static error_or encode(const data& from, data& to){ - - return make_error(); + static error_or encode(const data& from, buffer& to){ + for(size_t i = 0; i < from.size(); ++i){ + auto eov = stream_value::encode(from.at(i), to); + if(eov.is_error()){ + return eov; + } + } + return make_void(); } }; @@ -71,9 +160,21 @@ template struct csv_encode, FromDecode> { using Schema = schema::Primitive; - static error_or encode(const data& from, data& to){ - - return make_error(); + static error_or encode(const data& from, buffer& to){ + std::string to_str; + + try { + to_str = std::to_string(from.get()); + }catch(const std::exception& ){ + return make_error(); + } + for(auto iter : to_str){ + auto eov = stream_value::encode(iter, to); + if(eov.is_error()){ + return eov; + } + } + return make_void(); } }; } @@ -81,7 +182,13 @@ struct csv_encode, FromDecode> { template class data { private: + ring_buffer buffer_; public: + data() = default; + + buffer& get_buffer(){ + return buffer_; + } }; template @@ -90,8 +197,15 @@ class codec { public: template static error_or encode(const data& from, data& to){ + buffer_view buff_v{to.get_buffer()}; - return make_error(); + auto eov = impl::csv_encode::encode(from, buff_v); + if(eov.is_error()){ + return eov; + } + to.get_buffer().write_advance(buff_v.write_offset()); + + return eov; } template -- cgit v1.2.3