#include "../c++/cli_analyzer.hpp" #include #include #include #include namespace schema { using namespace saw::schema; using AnalyzeInner = Struct< Member, Member >; using AnalyzeTest = Struct< Member, Member >; } std::deque split_schema_path(const std::string_view& sch_arg){ std::deque split; bool escape = false; uint64_t last_pick = 0; for(uint64_t i = 0; i < sch_arg.size(); ++i){ if(escape){ escape = false; } else { if(sch_arg.at(i) == '\\'){ escape = true; }else if(sch_arg.at(i) == '.'){ std::string sub_str{sch_arg.substr(last_pick, i - last_pick)}; if(sub_str.empty()){ /// @todo return error return {}; } split.emplace_back(std::move(sub_str)); last_pick = i+1u; } } } if( ( sch_arg.size() == last_pick ) || escape ){ return {}; } std::string sub_str{sch_arg.substr(last_pick)}; split.emplace_back(std::move(sub_str)); return split; } int main(int argc, char** argv){ /** * Basic checking and wrapping args into an array of string_view * 1. mode * 2. file_path * 3. schema_path * 4. data if it's write */ int min_amount_args = 3; if( argc < (min_amount_args + 1) ) { std::cerr<<"Not enough arguments"< 32){ std::cerr<<"Too many arguments"< 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; }else if (args_view.at(1) == "l"){ return min_amount_args; } return 0u; }(); if(args_size < min_amount_args){ std::cerr<<"Invalid first argument. Must either be 'r', 'w' or 'l'."<(argc) ) ){ std::cerr<<"Invalid amount argument. Need "< std::string_view { return args_view.at(1); }(); std::string json_data; if ( mode == "w" ){ json_data = std::string{args_view.at(4)}; } std::deque sch_path = split_schema_path(args_view.at(3)); { auto eov = saw::modify_data_on_cli(mode, args_view.at(2), sch_path, json_data); if(eov.is_error()){ auto& err = eov.get_error(); std::cerr<<"Modification failed: "<