summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClaudius Holeksa <mail@keldu.de>2023-06-14 12:51:20 +0200
committerClaudius Holeksa <mail@keldu.de>2023-06-14 12:51:20 +0200
commit7779119ea724987128ebd4bb4c0433dee8b5f877 (patch)
treefa982e320eb93bfd5fb7ff6440739b77273359f8 /src
parent85398a9410a3ab36786c1e436986309ee6163f2f (diff)
c++: Let test run in test-case derivation and ammend changed schema
dimension changes
Diffstat (limited to 'src')
-rw-r--r--src/codec-json/json.tmpl.h76
-rw-r--r--src/codec/data.h25
-rw-r--r--src/codec/schema.h6
3 files changed, 102 insertions, 5 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h
index 38959b2..0d1c7f0 100644
--- a/src/codec-json/json.tmpl.h
+++ b/src/codec-json/json.tmpl.h
@@ -227,5 +227,81 @@ struct json_encode<schema::Struct<schema::Member<T,Key>...>, RootSchema, FromEnc
return void_t{};
}
};
+
+template<typename... T, string_literal... Key, typename RootSchema, typename FromEncode>
+struct json_encode<schema::Union<schema::Member<T,Key>...>, RootSchema, FromEncode> {
+
+ template<size_t i>
+ static error_or<void> encode_element(const data<schema::Union<schema::Member<T,Key>...>, FromEncode>& from, buffer& to){
+ if(from.template holds_alternative<typename parameter_key_pack_type<i, Key...>::literal>()){
+ // Encode the name
+ {
+ std::string_view view = parameter_key_pack_type<i, Key...>::literal.view();
+ error err = to.push('"');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ err = to.push(*reinterpret_cast<const uint8_t *>(view.data()), view.size());
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ err = to.push('"');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ }
+ // Add the separator
+ {
+ auto eov_ele = to.push(':');
+ if(!eov_ele.template is_type<err::no_error>()){
+ return eov_ele;
+ }
+ }
+
+ // Encode the value
+ auto eov = json_encode<typename parameter_pack_type<i, T...>::type, RootSchema, FromEncode>::encode(from.template get<parameter_key_pack_type<i, Key...>::literal>(), to);
+ }
+ // Go to the next element
+ if constexpr ( (i+1) < sizeof...(T)){
+ {
+ auto eov_ele = encode_element<i+1>(from, to);
+ if(eov_ele.is_error()){
+ return eov_ele;
+ }
+ }
+
+
+ }
+
+ return void_t{};
+ }
+ static error_or<void> encode(const data<schema::Union<schema::Member<T,Key>...>, FromEncode>& from, buffer& to) {
+ {
+ auto err = to.push('{');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ }
+ if constexpr ( sizeof...(T) > 0 ){
+ auto eov = encode_element<0>(from, to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ {
+ auto err = to.push('}');
+ if(!err.template is_type<err::no_error>()){
+ return err;
+ }
+ }
+
+ return void_t{};
+ }
+};
+
+template<typename Schema, typename RootSchema, typename ToDecode>
+struct json_decode;
+
+
}
}
diff --git a/src/codec/data.h b/src/codec/data.h
index 469e214..5e6fd25 100644
--- a/src/codec/data.h
+++ b/src/codec/data.h
@@ -76,6 +76,27 @@ private:
};
template<typename... T, string_literal... literals>
+class data<schema::Union<schema::Member<T, literals>...>, encode::Native> {
+private:
+ std::variant<data<T,encode::Native>...> value_;
+public:
+ data() = default;
+
+ SAW_DEFAULT_COPY(data);
+ SAW_DEFAULT_MOVE(data);
+
+ template<string_literal lit>
+ bool holds_alternative() const {
+ return std::holds_alternative<parameter_key_pack_index<lit, literals...>::value>(value_);
+ }
+
+ template<string_literal lit>
+ data<typename parameter_pack_type<parameter_key_pack_index<lit, literals...>::value>::type, encode::Native>& get(){
+ return std::get<parameter_key_pack_index<lit, literals...>::value>(value_);
+ }
+};
+
+template<typename... T, string_literal... literals>
class data<schema::Struct<schema::Member<T, literals>...>, encode::Native> {
private:
std::tuple<data<T,encode::Native>...> value_;
@@ -135,8 +156,8 @@ public:
}
};
-template<typename T>
-class data<schema::Array<T>, encode::Native> {
+template<typename T, size_t Dim>
+class data<schema::Array<T,Dim>, encode::Native> {
private:
std::vector<data<T, encode::Native>> value_;
public:
diff --git a/src/codec/schema.h b/src/codec/schema.h
index df9f443..2a548df 100644
--- a/src/codec/schema.h
+++ b/src/codec/schema.h
@@ -26,17 +26,17 @@ template <typename... T> struct Union {
template <typename... V, string_literal... K>
struct Union<Member<V, K>...> {};
-template <typename T> struct Array {};
+template <typename T, size_t Dim = 1> struct Array {};
template <class T> struct is_array {
constexpr static bool value = false;
};
-template <class T> struct is_array<schema::Array<T>> {
+template <class T, size_t Dim> struct is_array<schema::Array<T,Dim>> {
constexpr static bool value = true;
};
-template<typename T, size_t S> struct FixedArray {};
+template<typename T, size_t... S> struct FixedArray {};
template <typename... T> struct Tuple {};