#pragma once #include #include "data.h" namespace saw { namespace encode { struct Csv {}; } namespace impl { template struct csv_encode { static_assert(always_false, "Case not supported"); }; template struct csv_encode, FromDecode> { static_assert(Dim == 1, "Only one dimension is allowed."); static_assert(!is_array::value, "Array of an array is not allowed."); static_assert(is_tuple::value || is_struct::value, "Only struct or tuples allowed inside a csv array"); using Schema = schema::Array; static error_or encode(const data& from, data& to){ if constexpr (is_struct::value){ auto eov = csv_encode::encode_header(to); if(eov.is_error()){ return eov; } } for(std::size_t i = 0; i < from.size(); ++i){ auto eov = csv_encode::encode(from.at(i), to); if(eov.is_error()){ return eov; } } return void_t{}; } }; template<> struct csv_encode { using Schema = schema::String; static error_or encode(const data& from, data& to){ return void_t{}; } }; } template class codec { static_assert(is_array::value, "Only an Array is allowed as a base value"); public: template static error_or encode(const data& from, data& to){ return make_error(); } template static error_or decode(data& from, data& to){ return make_error(); } }; }