#pragma once #include #include namespace saw { namespace impl { struct cli_mode { struct read {}; struct write {}; }; template struct cli_traverser { static_assert(always_false, "Not supported"); }; template struct cli_modifier { codec json; codec encoded; error_or read(data& enc_data, std::deque& sch_path, std::string& json_data_str){ data native; { auto eov = encoded.decode(enc_data, native); if(eov.is_error()){ return eov; } } { data json_data; auto eov = json.encode(native, json_data); if(eov.is_error()){ return eov; } json_data_str = convert_to_string(json_data.get_buffer()); } return void_t{}; } error_or write(data& enc_data, std::deque& sch_path, std::string& json_data_str){ data native; { /// @todo string to data data json_data{ std::string_view{json_data_str} }; auto eov = json.decode(json_data, native); if(eov.is_error()){ return eov; } } { auto eov = encoded.encode(native, enc_data); if(eov.is_error()){ return eov; } }i return void_t{}; } }; template struct cli_traverser...>, Encoding> { using Schema = schema::Struct...>; template static error_or traverse(std::deque& sch_path, std::string& json_data){ if(sch_path.empty()){ cli_modifier mod; if constexpr (std::is_same_v){ return mod.read(sch_path, json_data); } else if constexpr (std::is_same_v) { return mod.write(sch_path, json_data); } else { return make_error(); } } else { } return void_t{}; } }; } template int modify_data_on_cli(int argc, char** argv){ /// @todo parse cli data bool read_mode = true; std::deque sch_path; std::string json_data; if (read_mode) { auto eov = impl::cli_modifier::traverse(sch_path, json_data); if(eov.is_error()){ return -1; } } else { auto eov = impl::cli_modifier::traverse(sch_path, json_data); if(eov.is_error()){ return -1; } } return 0; } }