summaryrefslogtreecommitdiff
path: root/modules/tools
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2024-04-02 16:27:41 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2024-04-02 16:27:41 +0200
commit3213bef6aa2b87cf8ea207e53ddf1b064539b46a (patch)
treed9ddd3e31fb84184a96394ec4b06dd5af2031127 /modules/tools
parent21c8b8c54fd2a6308cc9225983b3b3e11fbe958c (diff)
core, tools: Fixed include bug and some other behaviours
Diffstat (limited to 'modules/tools')
-rw-r--r--modules/tools/c++/cli_analyzer.hpp60
-rw-r--r--modules/tools/examples/cli_mod.cpp60
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;
}