bool JsonUtils::CreateError(rapidjson::Document& document, int err, const std::string& message) { rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); document.SetObject(); document.AddMember("code", err, allocator); document.AddMember("message", rapidjson::Value(message.c_str(), allocator), allocator); }
// The AST entry point. Here begins everything. bool SuperastCPP::TraverseTranslationUnitDecl( clang::TranslationUnitDecl* unitDecl) { // Create the block object at root of DOM document.SetObject(); // Set the pointer. Statements from root will be added here addId(document); document.AddMember("statements", rapidjson::kArrayType, allocator); for (auto declaration : unitDecl->decls()) { TRY_TO(TraverseDecl(declaration)); if (!sonValue.IsNull()) { if (sonValue.IsArray()) { addElemsToArray(document["statements"], sonValue); } else { document["statements"].PushBack(sonValue, allocator); } } } return true; }
static bool pyobj2doc(PyObject *object, rapidjson::Document& doc) { if (PyBool_Check(object)) { if (Py_True == object) { doc.SetBool(true); } else { doc.SetBool(false); } } else if (Py_None == object) { doc.SetNull(); } else if (PyFloat_Check(object)) { doc.SetDouble(PyFloat_AsDouble(object)); } else if (PyInt_Check(object)) { doc.SetInt64(PyLong_AsLong(object)); } else if (PyString_Check(object)) { doc.SetString(PyString_AsString(object), PyString_GET_SIZE(object)); } else if (PyUnicode_Check(object)) { PyObject *utf8_item; utf8_item = PyUnicode_AsUTF8String(object); if (!utf8_item) { PyErr_SetString(PyExc_RuntimeError, "codec error."); return false; } #ifdef PY3 doc.SetString(PyBytes_AsString(utf8_item), PyBytes_GET_SIZE(utf8_item), doc.GetAllocator()); #else doc.SetString(PyString_AsString(utf8_item), PyString_GET_SIZE(utf8_item), doc.GetAllocator()); #endif Py_XDECREF(utf8_item); } else if (PyTuple_Check(object)) { int len = PyTuple_Size(object), i; doc.SetArray(); rapidjson::Value _v; for (i = 0; i < len; ++i) { PyObject *elm = PyTuple_GetItem(object, i); if (false == pyobj2doc(elm, _v, doc)) { return false; } doc.PushBack(_v, doc.GetAllocator()); } } else if (PyList_Check(object)) { int len = PyList_Size(object), i; doc.SetArray(); rapidjson::Value _v; for (i = 0; i < len; ++i) { PyObject *elm = PyList_GetItem(object, i); if (false == pyobj2doc(elm, _v, doc)) { return false; } doc.PushBack(_v, doc.GetAllocator()); } } else if (PyDict_Check(object)) { doc.SetObject(); PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(object, &pos, &key, &value)) { if (false == pyobj2doc_pair(key, value, doc)) { return false; } } } else { PyErr_SetString(PyExc_RuntimeError, "invalid python object"); return false; } return true; }
static void pyobj2doc(PyObject *object, rapidjson::Document& doc) { if (PyBool_Check(object)) { if (Py_True == object) { doc.SetBool(true); } else { doc.SetBool(false); } } else if (Py_None == object) { doc.SetNull(); } else if (PyFloat_Check(object)) { doc.SetDouble(PyFloat_AsDouble(object)); } else if (PyInt_Check(object)) { doc.SetInt(PyLong_AsLong(object)); } else if (PyString_Check(object)) { doc.SetString(PyString_AsString(object), PyString_GET_SIZE(object)); } else if (PyUnicode_Check(object)) { #ifdef PY3 PyObject *utf8_item; utf8_item = PyUnicode_AsUTF8String(object); if (!utf8_item) { // TODO: error handling printf("error\n"); } doc.SetString(PyBytes_AsString(utf8_item), PyBytes_Size(utf8_item), doc.GetAllocator()); Py_XDECREF(utf8_item); #else doc.SetString(PyBytes_AsString(object), PyBytes_GET_SIZE(object)); #endif } else if (PyTuple_Check(object)) { int len = PyTuple_Size(object), i; doc.SetArray(); rapidjson::Value _v; for (i = 0; i < len; ++i) { PyObject *elm = PyList_GetItem(object, i); pyobj2doc(elm, _v, doc); doc.PushBack(_v, doc.GetAllocator()); } } else if (PyList_Check(object)) { int len = PyList_Size(object), i; doc.SetArray(); rapidjson::Value _v; for (i = 0; i < len; ++i) { PyObject *elm = PyList_GetItem(object, i); pyobj2doc(elm, _v, doc); doc.PushBack(_v, doc.GetAllocator()); } } else if (PyDict_Check(object)) { doc.SetObject(); PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(object, &pos, &key, &value)) { pyobj2doc_pair(key, value, doc); } } else { // TODO: error handle } }