initial code repo
[stor4nfv.git] / src / ceph / src / common / cmdparse.h
diff --git a/src/ceph/src/common/cmdparse.h b/src/ceph/src/common/cmdparse.h
new file mode 100644 (file)
index 0000000..41495f5
--- /dev/null
@@ -0,0 +1,84 @@
+// -*- 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 <vector>
+#include <stdexcept>
+#include <ostream>
+#include <boost/variant.hpp>
+#include "include/assert.h"    // boost clobbers this
+#include "common/Formatter.h"
+#include "common/BackTrace.h"
+
+class CephContext;
+
+/* this is handy; can't believe it's not standard */
+#define ARRAY_SIZE(a)  (sizeof(a) / sizeof(*a))
+
+typedef boost::variant<std::string,
+                      bool,
+                      int64_t,
+                      double,
+                      std::vector<std::string>,
+                      std::vector<int64_t>,
+                      std::vector<double>>  cmd_vartype;
+typedef std::map<std::string, cmd_vartype> cmdmap_t;
+
+std::string cmddesc_get_prefix(const std::string &cmddesc);
+void dump_cmd_to_json(ceph::Formatter *f, const std::string& cmd);
+void dump_cmd_and_help_to_json(ceph::Formatter *f,
+                              const std::string& secname,
+                              const std::string& cmd,
+                              const std::string& helptext);
+void dump_cmddesc_to_json(ceph::Formatter *jf,
+                         const std::string& secname,
+                         const std::string& cmdsig,
+                         const std::string& helptext,
+                         const std::string& module,
+                         const std::string& perm,
+                         const std::string& avail,
+                         uint64_t flags);
+bool cmdmap_from_json(std::vector<std::string> cmd, cmdmap_t *mapp,
+                     std::stringstream &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);
+
+template <typename T>
+bool
+cmd_getval(CephContext *cct, const cmdmap_t& cmdmap, const std::string& k, T& val)
+{
+  if (cmdmap.count(k)) {
+    try {
+      val = boost::get<T>(cmdmap.find(k)->second);
+      return true;
+    } catch (boost::bad_get) {
+      handle_bad_get(cct, k, typeid(T).name());
+    }
+  }
+  return false;
+}
+
+// with default
+
+template <typename T>
+void
+cmd_getval(CephContext *cct, const cmdmap_t& cmdmap, const std::string& k, T& val, const T& defval)
+{
+  if (!cmd_getval(cct, cmdmap, k, val))
+    val = defval;
+}
+
+template <typename T>
+void
+cmd_putval(CephContext *cct, cmdmap_t& cmdmap, const std::string& k, const T& val)
+{
+  cmdmap[k] = val;
+}
+
+extern int parse_osd_id(const char *s, std::ostream *pss);
+extern long parse_pos_long(const char *s, std::ostream *pss = NULL);
+
+#endif