diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-02-05 17:39:28 +0100 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-02-05 17:39:28 +0100 |
commit | 2790590996da2f6a0f4d59570de62078a5ac8ae2 (patch) | |
tree | 526c188230bd29d5127cc13d10390b1cd134bebc /modules/tools/cli_analyzer.hpp | |
parent | 4e45bbc55c4011b919f0af8d43850748209f7f09 (diff) |
tools: Move to new module structure and moving to more schema based
generation to convert more easily to json
Diffstat (limited to 'modules/tools/cli_analyzer.hpp')
-rw-r--r-- | modules/tools/cli_analyzer.hpp | 183 |
1 files changed, 0 insertions, 183 deletions
diff --git a/modules/tools/cli_analyzer.hpp b/modules/tools/cli_analyzer.hpp deleted file mode 100644 index 402f03c..0000000 --- a/modules/tools/cli_analyzer.hpp +++ /dev/null @@ -1,183 +0,0 @@ -#pragma once - -#include <forstio/codec/schema.hpp> - -#include <iostream> - -namespace saw { -namespace impl { -struct cli_mode { - struct read {}; - struct write {}; -}; - -template<typename T, typename Encoding> -struct cli_traverser { - static_assert(always_false<T,Encoding>, "Not supported"); -}; - -template<typename Schema, typename Encoding> -struct cli_modifier { - codec<Schema, encode::Json> json; - codec<Schema, Encoding> encoded; - - error_or<void> read( - std::deque<std::string>& sch_path, - data<Schema, Encoding>& enc_data, - std::string& json_data_str - ){ - data<Schema, encode::Native> native; - if constexpr ( std::is_same_v<Encoding, encode::Native> ){ - auto eov = encoded.decode<encode::Native>(enc_data, native); - if(eov.is_error()){ - return eov; - } - }else{ - native = enc_data; - } - { - data<Schema, encode::Json> json_data; - auto eov = json.encode<encode::Native>(native, json_data); - if(eov.is_error()){ - return eov; - } - - json_data_str = convert_to_string(json_data.get_buffer()); - - std::cout<<json_data_str<<std::endl; - } - - return void_t{}; - } - - error_or<void> write( - std::deque<std::string>& sch_path, - data<Schema, Encoding>& enc_data, - std::string& json_data_str - ){ - data<Schema, encode::Native> native; - { - /// @todo string to data - data<Schema, encode::Json> json_data{ std::string_view{json_data_str} }; - auto eov = json.decode<encode::Native>(json_data, native); - if(eov.is_error()){ - return eov; - } - } - if constexpr (std::is_same_v<Encoding, encode::Native> ){ - auto eov = encoded.encode<encode::Native>(native, enc_data); - if(eov.is_error()){ - return eov; - } - }else{ - enc_data = native; - } - - return void_t{}; - } -}; - -template<typename... T, typename Encoding> -struct cli_traverser<schema::Tuple<T...>, Encoding> { - using Schema = schema::Tuple<T...>; - - template<typename Traversal, size_t i> - static error_or<void> traverse_member(std::deque<std::string>& sch_path, data<Schema, Encoding>& enc_data, std::string& json_data){ - using Type = typename parameter_pack_type<i,T...>::type; - - std::string num_str = std::to_string(i); - if( num_str == sch_path.front() ){ - sch_path.pop_front(); - return cli_traverser<Type, Encoding>::traverse<Traversal>(sch_path, enc_data.template get<i>(), json_data); - } - - if ( (i+1) < sizeof...(T)){ - return traverse_member<Traversal, i+1>(sch_path, enc_data, json_data); - } - return make_error<err::invalid_state>("Didn't find tuple path element"); - } -}; - -/** - * Traverse the path until we hit the end of the provided path - */ -template<typename... T, string_literal... Lits, typename Encoding> -struct cli_traverser<schema::Struct<schema::Member<T,Lits>...>, Encoding> { - using Schema = schema::Struct<schema::Member<T,Lits>...>; - - template<typename Traversal, size_t i> - static error_or<void> traverse_member(std::deque<std::string>& sch_path, data<Schema,Encoding>& enc_data, std::string& json_data){ - using Type = typename parameter_pack_type<i,T...>::type; - constexpr string_literal Literal = parameter_key_pack_type<i, Lits...>::literal; - - if ( Literal.view() == sch_path.front() ){ - sch_path.pop_front(); - return cli_traverser<Type>::traverse<Traversal>(sch_path, enc_data.template get<Literal>(), json_data); - } - - if constexpr ( (i+1) < sizeof...(T) ) { - return traverse_member<Traversal, i+1>(sch_path, enc_data, json_data); - } - return make_error<err::invalid_state>("Didn't find struct path element"); - } - - template<typename Traversal> - static error_or<void> traverse(std::deque<std::string>& sch_path, data<Schema,Encoding>& enc_data, std::string& json_data){ - /** - * If our path is empty, then we have reached the desired destination. - */ - if(sch_path.empty()){ - /** - * Decide during this step if we are reading or not - */ - cli_modifier<Schema, Encoding> mod; - if constexpr (std::is_same_v<Traversal, cli_mode::read>){ - return mod.read(sch_path, json_data); - } else if constexpr (std::is_same_v<Traversal, cli_mode::write>) { - return mod.write(sch_path, json_data); - } else { - return make_error<err::invalid_state>("We only support cli_mode::read and cli_mode::write"); - } - } else { - if constexpr ( sizeof...(T) > 0 ){ - return traverse_member<Traversal, 0>(sch_path, json_data); - } - return make_error<err::invalid_state>("No elements in struct while path isn't empty"); - } - - return void_t{}; - } -}; -} - -struct parsed_args { - bool read_mode = true; - std::string file_path; - std::deque<std::string> sch_path; -}; - -template<typename Schema, typename Encoding> -int modify_data_on_cli(bool read_mode, const std::string& file_path, std::deque<std::string> sch_path, std::string& json_data){ - /** - * Read data from file - */ - - - data<Schema, Encoding> data; - data<Schema, encode::Native> native_data; - - if (read_mode) { - auto eov = impl::cli_modifier<Schema, encode::Native>::traverse<impl::cli_mode::read>(sch_path, native_data, json_data); - if(eov.is_error()){ - return -1; - } - } else { - auto eov = impl::cli_modifier<Schema, encode::Native>::traverse<impl::cli_mode::write>(sch_path, native_data, json_data); - if(eov.is_error()){ - return -1; - } - } - - return 0; -} -} |