%module yang %{ extern "C" { #include "libyang.h" #include "tree_data.h" #include "tree_schema.h" } %} %include exception.i %include %include %include %catches(std::runtime_error, std::exception, std::string); %inline %{ #include #include "libyang.h" #include #include #include #include "Libyang.hpp" #include "Tree_Data.hpp" class Wrap_cb { public: Wrap_cb(PyObject *callback): _callback(nullptr) { if (!PyCallable_Check(callback)) { throw std::runtime_error("Python Object is not callable.\n"); } else { _callback = callback; Py_XINCREF(_callback); } } ~Wrap_cb() { if(_callback) Py_XDECREF(_callback); } std::pair ly_module_imp_clb(const char *mod_name, const char *mod_rev, const char *submod_name, const char *sub_rev, PyObject *user_data) { PyObject *arglist = Py_BuildValue("(ssssO)", mod_name, mod_rev, submod_name, sub_rev, user_data); PyObject *my_result = PyEval_CallObject(_callback, arglist); Py_DECREF(arglist); if (my_result == nullptr) { throw std::runtime_error("Python callback ly_module_imp_clb failed.\n"); } else { LYS_INFORMAT format; char *data; if (!PyArg_ParseTuple(my_result, "is", &format, &data)) { Py_DECREF(my_result); std::runtime_error("failed to parse ly_module_imp_clb"); } Py_DECREF(my_result); return std::make_pair(data,format); } } PyObject *private_ctx; private: PyObject *_callback; }; static const char *g_ly_module_imp_clb(const char *mod_name, const char *mod_rev, const char *submod_name, const char *sub_rev, void *user_data, LYS_INFORMAT *format, void (**free_module_data)(void *model_data, void *user_data)) { Wrap_cb *ctx = (Wrap_cb *) user_data; (void)free_module_data; auto pair = ctx->ly_module_imp_clb(mod_name, mod_rev, submod_name, sub_rev, ctx->private_ctx); *format = pair.second; return pair.first; } %} %extend libyang::Context { void set_module_imp_clb(PyObject *clb, PyObject *user_data = nullptr) { /* create class */ Wrap_cb *class_ctx = nullptr; class_ctx = new Wrap_cb(clb); self->wrap_cb_l.push_back(class_ctx); if (user_data) { class_ctx->private_ctx = user_data; } else { Py_INCREF(Py_None); class_ctx->private_ctx = Py_None; } ly_ctx_set_module_imp_clb(self->swig_ctx(), g_ly_module_imp_clb, class_ctx); }; } %extend libyang::Data_Node { PyObject *subtype() { PyObject *casted = 0; auto type = self->swig_node()->schema->nodetype; if (LYS_LEAF == type || LYS_LEAFLIST == type) { auto node_leaf_list = new std::shared_ptr(new libyang::Data_Node_Leaf_List(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node_leaf_list), SWIGTYPE_p_std__shared_ptrT_libyang__Data_Node_Leaf_List_t, SWIG_POINTER_OWN); } else if (LYS_ANYDATA == type || LYS_ANYXML == type) { auto node_anydata = new std::shared_ptr(new libyang::Data_Node_Anydata(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node_anydata), SWIGTYPE_p_std__shared_ptrT_libyang__Data_Node_Anydata_t, SWIG_POINTER_OWN); } else { auto node = new std::shared_ptr(new libyang::Data_Node(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Data_Node_t, SWIG_POINTER_OWN); } return casted; } }; %extend libyang::Schema_Node { PyObject *subtype() { PyObject *casted = 0; auto type = self->swig_node()->nodetype; if (LYS_CONTAINER == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Container(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Container_t, SWIG_POINTER_OWN); } else if (LYS_CHOICE == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Choice(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Choice_t, SWIG_POINTER_OWN); } else if (LYS_LEAF == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Leaf(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Leaf_t, SWIG_POINTER_OWN); } else if (LYS_LEAFLIST == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Leaflist(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Leaflist_t, SWIG_POINTER_OWN); } else if (LYS_LIST == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_List(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_List_t, SWIG_POINTER_OWN); } else if (LYS_ANYDATA == type || LYS_ANYXML == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Anydata(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Anydata_t, SWIG_POINTER_OWN); } else if (LYS_USES == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Uses(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Uses_t, SWIG_POINTER_OWN); } else if (LYS_GROUPING == type || LYS_RPC == type || LYS_ACTION == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Grp(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Grp_t, SWIG_POINTER_OWN); } else if (LYS_CASE == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Case(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Case_t, SWIG_POINTER_OWN); } else if (LYS_INPUT == type || LYS_OUTPUT == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Inout(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Inout_t, SWIG_POINTER_OWN); } else if (LYS_NOTIF == type) { auto node = new std::shared_ptr(new libyang::Schema_Node_Notif(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_Notif_t, SWIG_POINTER_OWN); } else { auto node = new std::shared_ptr(new libyang::Schema_Node(self->swig_node(), self->swig_deleter())); casted = SWIG_NewPointerObj(SWIG_as_voidptr(node), SWIGTYPE_p_std__shared_ptrT_libyang__Schema_Node_t, SWIG_POINTER_OWN); } return casted; } }; %include "../swig_base/python_base.i"