From 57c8ff05f4b19762b6915aac83c1245a54ee7f42 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 2 Apr 2024 17:48:37 +0200 Subject: tools, codec-json: Initial whitespace is also valid json. Also fixed reading for cli manip as well --- modules/tools/c++/cli_analyzer.hpp | 86 ++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 13 deletions(-) (limited to 'modules/tools/c++/cli_analyzer.hpp') diff --git a/modules/tools/c++/cli_analyzer.hpp b/modules/tools/c++/cli_analyzer.hpp index 4aa3d6c..9a0998b 100644 --- a/modules/tools/c++/cli_analyzer.hpp +++ b/modules/tools/c++/cli_analyzer.hpp @@ -6,6 +6,7 @@ #include #include +#include #include namespace saw { @@ -42,8 +43,6 @@ struct cli_modifier { } json_data_str = convert_to_string(json_data.get_buffer()); - - std::cout< +struct cli_traverser { + using Schema = schema::String; + + template + static error_or traverse(std::deque& sch_path, data& enc_data, std::string& json_data){ + if(not sch_path.empty()){ + return make_error("Schema path too long"); + } + + cli_modifier mod; + if constexpr (std::is_same_v){ + return mod.read(sch_path, enc_data, json_data); + } else if constexpr (std::is_same_v) { + return mod.write(sch_path, enc_data, json_data); + } else { + return make_error("We only support cli_mode::read and cli_mode::write"); + } + } + +}; + template struct cli_traverser, Encoding> { using Schema = schema::Tuple; @@ -146,27 +167,66 @@ struct parsed_args { }; template -int modify_data_on_cli(bool read_mode, const std::string_view& file_path, std::deque sch_path, std::string& json_data){ - /** +error_or modify_data_on_cli(bool read_mode, const std::string_view& file_path, std::deque sch_path, std::string& json_data){ + /** * Read data from file */ - + std::string file_data = [&]() -> std::string { + std::fstream fstr{std::string{file_path}, fstr.binary | fstr.in}; + if(!fstr.is_open()){ + return {}; + } + std::stringstream sstr; + sstr << fstr.rdbuf(); + return sstr.str(); + }(); + if(file_data.empty()){ + return make_error("File exists, but is empty."); + } + data enc_data{std::string_view{file_data}}; + codec enc_codec; - data enc_data; data native_data; + { + auto eov = enc_codec.template decode(enc_data, native_data); + if(eov.is_error()){ + return eov; + } + } if (read_mode) { - auto eov = impl::cli_traverser::template traverse(sch_path, native_data, json_data); - if(eov.is_error()){ - return -1; + { + auto eov = impl::cli_traverser::template traverse(sch_path, native_data, json_data); + if(eov.is_error()){ + return eov; + } } } else { - auto eov = impl::cli_traverser::template traverse(sch_path, native_data, json_data); - if(eov.is_error()){ - return -1; + { + auto eov = impl::cli_traverser::template traverse(sch_path, native_data, json_data); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = enc_codec.template encode(native_data, enc_data); + if(eov.is_error()){ + return eov; + } + } + { + std::fstream fstr{std::string{file_path}, fstr.binary | fstr.out | fstr.trunc }; + if(!fstr.is_open()){ + return make_error("Couldn't open file"); + } + std::stringstream sstr; + std::string enc_str = convert_to_string(enc_data.get_buffer()); + + fstr << enc_str; + fstr.close(); } } - return 0; + return void_t{}; } } -- cgit v1.2.3