summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2023-06-29 14:40:16 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2023-06-29 14:40:16 +0200
commit7250a86b7eab2692d5c17d071436c84bac4574df (patch)
tree35598c441ce7985425ff787e59bdba2437a3ff09 /src
parentdd5d61330032511f5b0e05e813bbfe2054841f5d (diff)
c++,codec-json: Implemented Tuple Decoding
Diffstat (limited to 'src')
-rw-r--r--src/codec-json/json.tmpl.h62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h
index 6cf7189..3d3ad91 100644
--- a/src/codec-json/json.tmpl.h
+++ b/src/codec-json/json.tmpl.h
@@ -3,6 +3,8 @@
#include <charconv>
#include <sstream>
+#include <iostream>
+
namespace saw {
namespace impl {
template<typename Schema, typename RootSchema, typename FromEncode>
@@ -468,7 +470,7 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, RootSchema, ToDeco
constexpr static string_literal Literal = parameter_key_pack_type<i, Lits...>::literal;
if(search_name == Literal.view()){
if(fields[i]){
- // TODO Change to this
+ // TODO Change to this. Maybe
// return make_error<err::already_exists>();
return make_error<err::invalid_state>();
}
@@ -547,6 +549,8 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, RootSchema, ToDeco
if(buff.read_composite_length() == 0){
return make_error<err::buffer_exhausted>();
}
+
+ // Check if there are no elements present in the JSON Struct
if(buff.read() == '}'){
if(sizeof...(T) > 0){
return make_error<err::invalid_state>();
@@ -564,6 +568,62 @@ struct json_decode<schema::Struct<schema::Member<T,Lits>...>, RootSchema, ToDeco
}
};
+template<typename... T, typename RootSchema, typename ToDecode>
+struct json_decode<schema::Tuple<T...>, RootSchema, ToDecode> {
+ template<std::size_t i>
+ static error_or<void> decode_element(buffer_view& buff, data<schema::Tuple<T...>, ToDecode>& to){
+ if constexpr (i < sizeof...(T)){
+ if constexpr ( i > 0 ){
+ if(buff.read() != ','){
+ return make_error<err::invalid_state>();
+ }
+ buff.read_advance(1);
+ if(buff.read_composite_length() == 0){
+ return make_error<err::buffer_exhausted>();
+ }
+ }
+ using Type = typename parameter_pack_type<i, T...>::type;
+
+ auto eov = json_decode<Type, RootSchema, ToDecode>::decode(buff, to.template get<i>());
+ if(eov.is_error()){
+ return eov;
+ }
+ json_helper::skip_whitespace(buff);
+ if(buff.read_composite_length() == 0){
+ return make_error<err::buffer_exhausted>();
+ }
+
+ eov = decode_element<i+1>(buff, to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }else{
+ if(buff.read() != ']'){
+ return make_error<err::invalid_state>();
+ }
+ buff.read_advance(1);
+ }
+ return void_t{};
+ }
+
+ static error_or<void> decode(buffer_view& buff, data<schema::Tuple<T...>, ToDecode>& to){
+ assert(buff.read() == '[');
+ buff.read_advance(1);
+
+ json_helper::skip_whitespace(buff);
+ if(buff.read_composite_length() == 0){
+ return make_error<err::buffer_exhausted>();
+ }
+
+ auto eov = decode_element<0>(buff, to);
+ if(eov.is_error()){
+ return eov;
+ }
+
+ return void_t{};
+ }
+};
+
// The whole std::vector approach is hacky af. ToDo change it maybe?
template<typename T, size_t D, typename RootSchema, typename ToDecode>
struct json_decode<schema::Array<T,D>, RootSchema, ToDecode> {