diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-04-02 16:27:41 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-04-02 16:27:41 +0200 |
commit | 3213bef6aa2b87cf8ea207e53ddf1b064539b46a (patch) | |
tree | d9ddd3e31fb84184a96394ec4b06dd5af2031127 /modules/tools | |
parent | 21c8b8c54fd2a6308cc9225983b3b3e11fbe958c (diff) |
core, tools: Fixed include bug and some other behaviours
Diffstat (limited to 'modules/tools')
-rw-r--r-- | modules/tools/c++/cli_analyzer.hpp | 60 | ||||
-rw-r--r-- | modules/tools/examples/cli_mod.cpp | 60 |
2 files changed, 85 insertions, 35 deletions
diff --git a/modules/tools/c++/cli_analyzer.hpp b/modules/tools/c++/cli_analyzer.hpp index a1dc731..4aa3d6c 100644 --- a/modules/tools/c++/cli_analyzer.hpp +++ b/modules/tools/c++/cli_analyzer.hpp @@ -1,7 +1,11 @@ #pragma once +#include <forstio/templates.hpp> #include <forstio/codec/schema.hpp> +#include <forstio/codec/data.hpp> +#include <forstio/codec/json/json.hpp> +#include <deque> #include <iostream> namespace saw { @@ -11,33 +15,28 @@ struct cli_mode { 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_traverser { + template<typename Traversal> + static error_or<void> traverse(std::deque<std::string>& sch_path, data<Schema,Encoding>& enc_data, std::string& json_data){ + return make_error<err::invalid_state>("Exhausted path or structure is not supported as of this moment"); + } }; template<typename Schema, typename Encoding> struct cli_modifier { codec<Schema, encode::Json> json; - codec<Schema, Encoding> encoded; + static_assert( std::is_same_v<Encoding, encode::Native>, "Not supported" ); 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); + auto eov = json.template encode<Encoding>(enc_data, json_data); if(eov.is_error()){ return eov; } @@ -55,24 +54,14 @@ struct cli_modifier { 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); + auto eov = json.template decode<Encoding>(json_data, enc_data); 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{}; } }; @@ -88,7 +77,7 @@ struct cli_traverser<schema::Tuple<T...>, Encoding> { 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); + return cli_traverser<Type, Encoding>::template traverse<Traversal>(sch_path, enc_data.template get<i>(), json_data); } if ( (i+1) < sizeof...(T)){ @@ -112,7 +101,7 @@ struct cli_traverser<schema::Struct<schema::Member<T,Lits>...>, Encoding> { 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); + return cli_traverser<Type, Encoding>::template traverse<Traversal>(sch_path, enc_data.template get<Literal>(), json_data); } if constexpr ( (i+1) < sizeof...(T) ) { @@ -132,15 +121,15 @@ struct cli_traverser<schema::Struct<schema::Member<T,Lits>...>, Encoding> { */ cli_modifier<Schema, Encoding> mod; if constexpr (std::is_same_v<Traversal, cli_mode::read>){ - return mod.read(sch_path, json_data); + return mod.read(sch_path, enc_data, json_data); } else if constexpr (std::is_same_v<Traversal, cli_mode::write>) { - return mod.write(sch_path, json_data); + return mod.write(sch_path, enc_data, 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 traverse_member<Traversal, 0>(sch_path, enc_data, json_data); } return make_error<err::invalid_state>("No elements in struct while path isn't empty"); } @@ -157,21 +146,22 @@ struct parsed_args { }; 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){ +int modify_data_on_cli(bool read_mode, const std::string_view& file_path, std::deque<std::string> sch_path, std::string& json_data){ /** * Read data from file */ + - data<Schema, Encoding> data; + data<Schema, Encoding> enc_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); + auto eov = impl::cli_traverser<Schema, encode::Native>::template 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); + auto eov = impl::cli_traverser<Schema, encode::Native>::template traverse<impl::cli_mode::write>(sch_path, native_data, json_data); if(eov.is_error()){ return -1; } diff --git a/modules/tools/examples/cli_mod.cpp b/modules/tools/examples/cli_mod.cpp index 84b3dc6..42d4370 100644 --- a/modules/tools/examples/cli_mod.cpp +++ b/modules/tools/examples/cli_mod.cpp @@ -1,6 +1,66 @@ +#include "../c++/cli_analyzer.hpp" +#include <filesystem> +#include <fstream> + +#include <iostream> + +namespace schema { +using namespace saw::schema; + +using AnalyzeTest = Struct< + Member<String, "foo"> +>; +} int main(int argc, char** argv){ + /** + * Basic checking and wrapping args into an array of string_view + */ + int min_amount_args = 2; + + if( argc < (min_amount_args + 1) ) { + std::cerr<<"Not enough arguments"<<std::endl; + return -1; + } + + if(argc > 32){ + std::cerr<<"Too many arguments"<<std::endl; + return -1; + } + std::array<std::string_view, 32> args_view; + for(int i = 0; i < argc; ++i){ + args_view.at(i) = {argv[i]}; + } + + uint64_t args_size = [&]() -> uint64_t{ + if(args_view.at(1) == "r"){ + return min_amount_args; + }else if (args_view.at(1) == "w"){ + return min_amount_args + 1u; + } + return 0u; + }(); + + if(args_size < min_amount_args){ + std::cerr<<"Invalid first argument. Must either be 'r' or 'w'"<<std::endl; + return -1; + } + + bool is_read_mode = [&]() -> bool { + if(args_view.at(1) == "w"){ + return false; + } + return true; + }(); + + std::string json_data; + std::deque<std::string> sch_path; + int rc = saw::modify_data_on_cli<schema::AnalyzeTest, saw::encode::Json>(is_read_mode, args_view.at(2), sch_path, json_data); + + for(int i = 0; i < argc; ++i){ + std::cout<<args_view.at(i)<<std::endl; + } return 0; } |