summaryrefslogtreecommitdiff
path: root/py_option.cc
diff options
context:
space:
mode:
Diffstat (limited to 'py_option.cc')
-rw-r--r--py_option.cc73
1 files changed, 73 insertions, 0 deletions
diff --git a/py_option.cc b/py_option.cc
new file mode 100644
index 00000000..877d92a7
--- /dev/null
+++ b/py_option.cc
@@ -0,0 +1,73 @@
+using namespace boost::python;
+using namespace ledger;
+
+struct py_option_t : public option_t
+{
+ PyObject * self;
+
+ py_option_t(PyObject * self_,
+ const string& long_opt,
+ const bool wants_arg)
+ : self(self_), option_t(long_opt, wants_arg) {}
+
+ virtual ~py_option_t() {}
+
+ virtual bool check(option_source_t source) {
+ return call_method<bool>(self, "check", source);
+ }
+
+ virtual void select(report_t * report, const char * optarg = NULL) {
+ if (optarg)
+ return call_method<void>(self, "select", report, optarg);
+ else
+ return call_method<void>(self, "select", report);
+ }
+};
+
+BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(option_select_overloads,
+ py_option_t::select, 1, 2)
+
+typedef std::map<const string, object> options_map;
+typedef std::pair<const string, object> options_pair;
+
+options_map options;
+
+static option_t * find_option(const string& name)
+{
+ options_map::const_iterator i = options.find(name);
+ if (i != options.end())
+ return extract<py_option_t *>((*i).second.ptr());
+
+ return NULL;
+}
+
+void shutdown_option()
+{
+ options.clear();
+}
+
+void export_option()
+{
+ class_< option_t, py_option_t, boost::noncopyable >
+ ("Option", init<const string&, bool>())
+ .def_readonly("long_opt", &py_option_t::long_opt)
+ .def_readonly("short_opt", &py_option_t::short_opt)
+ .def_readonly("wants_arg", &py_option_t::wants_arg)
+ .def_readwrite("handled", &py_option_t::handled)
+ .def("check", &py_option_t::check)
+ .def("select", &py_option_t::select, option_select_overloads())
+ ;
+
+ enum_< option_t::option_source_t > ("OptionSource")
+ .value("InitFile", option_t::INIT_FILE)
+ .value("Environment", option_t::ENVIRONMENT)
+ .value("DataFile", option_t::DATA_FILE)
+ .value("CommandLine", option_t::COMMAND_LINE)
+ ;
+
+ class_< options_map > ("OptionsMap")
+ .def(map_indexing_suite<options_map>())
+ ;
+
+ scope().attr("options") = ptr(&options);
+}