// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #ifndef CEPH_COMMON_CMDPARSE_H #define CEPH_COMMON_CMDPARSE_H #include #include #include #include #include "include/ceph_assert.h" // boost clobbers this #include "include/common_fwd.h" #include "common/Formatter.h" #include "common/BackTrace.h" typedef boost::variant, std::vector, std::vector> cmd_vartype; typedef std::map> cmdmap_t; namespace TOPNSPC::common { std::string cmddesc_get_prefix(const std::string_view &cmddesc); std::string cmddesc_get_prenautilus_compat(const std::string &cmddesc); void dump_cmd_to_json(ceph::Formatter *f, uint64_t features, const std::string& cmd); void dump_cmd_and_help_to_json(ceph::Formatter *f, uint64_t features, const std::string& secname, const std::string& cmd, const std::string& helptext); void dump_cmddesc_to_json(ceph::Formatter *jf, uint64_t features, const std::string& secname, const std::string& cmdsig, const std::string& helptext, const std::string& module, const std::string& perm, uint64_t flags); bool cmdmap_from_json(const std::vector& cmd, cmdmap_t *mapp, std::ostream& ss); void cmdmap_dump(const cmdmap_t &cmdmap, ceph::Formatter *f); void handle_bad_get(CephContext *cct, const std::string& k, const char *name); std::string cmd_vartype_stringify(const cmd_vartype& v); struct bad_cmd_get : public std::exception { std::string desc; bad_cmd_get(const std::string& f, const cmdmap_t& cmdmap) { desc = "bad or missing field '" + f + "'"; } const char *what() const throw() override { return desc.c_str(); } }; bool cmd_getval(const cmdmap_t& cmdmap, const std::string& k, bool& val); template bool cmd_getval(const cmdmap_t& cmdmap, const std::string& k, T& val) { if (cmdmap.count(k)) { try { val = boost::get(cmdmap.find(k)->second); return true; } catch (boost::bad_get&) { throw bad_cmd_get(k, cmdmap); } } return false; } // with default template bool cmd_getval( const cmdmap_t& cmdmap, const std::string& k, T& val, const T& defval) { if (cmdmap.count(k)) { try { val = boost::get(cmdmap.find(k)->second); return true; } catch (boost::bad_get&) { throw bad_cmd_get(k, cmdmap); } } else { val = defval; return true; } } template void cmd_putval(CephContext *cct, cmdmap_t& cmdmap, const std::string& k, const T& val) { cmdmap[k] = val; } bool validate_cmd(CephContext* cct, const std::string& desc, const cmdmap_t& cmdmap, std::ostream& os); extern int parse_osd_id(const char *s, std::ostream *pss); extern long parse_pos_long(const char *s, std::ostream *pss = NULL); } #endif