{"id":16699504,"url":"https://github.com/ousttrue/msgpackpp","last_synced_at":"2025-07-12T15:13:54.000Z","repository":{"id":8428042,"uuid":"10016175","full_name":"ousttrue/msgpackpp","owner":"ousttrue","description":"c++17 header only msgpack implementation. (msgpack-rpc-asio)","archived":false,"fork":false,"pushed_at":"2021-09-09T16:03:58.000Z","size":1364,"stargazers_count":34,"open_issues_count":2,"forks_count":11,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-03T23:51:08.655Z","etag":null,"topics":["cpp","messagepack-rpc","msgpack"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ousttrue.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-05-12T16:25:59.000Z","updated_at":"2025-03-20T05:53:51.000Z","dependencies_parsed_at":"2022-07-30T00:47:51.680Z","dependency_job_id":null,"html_url":"https://github.com/ousttrue/msgpackpp","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/ousttrue/msgpackpp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ousttrue%2Fmsgpackpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ousttrue%2Fmsgpackpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ousttrue%2Fmsgpackpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ousttrue%2Fmsgpackpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ousttrue","download_url":"https://codeload.github.com/ousttrue/msgpackpp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ousttrue%2Fmsgpackpp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265009351,"owners_count":23697158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","messagepack-rpc","msgpack"],"created_at":"2024-10-12T18:07:12.955Z","updated_at":"2025-07-12T15:13:53.977Z","avatar_url":"https://github.com/ousttrue.png","language":"C++","readme":"# msgpackpp\n\n`c++17` header only [msgpack](https://github.com/msgpack/msgpack/blob/master/spec.md) implementation.\n\n`msgpack-rpc-asio` and `msgpackpp` is merged.\n\n\u003chttps://github.com/ousttrue/NvimTexture\u003e backend.\n\n# header\n## msgpackpp/msgpackpp.h\n\n* `c++17` header only msgpack implementation.\n* no dependency\n\n## msgpackpp/rpc.h\n\n* `c++17` header only msgpack-rpc implementation.\n* depends on [asio header only](http://think-async.com/Asio/index.html)\n\n## msgpackpp/windows_pipe_transport.h\n\n* Windows PIPE transport for `nvim --embed`\n* depends on Windows.h\n\n# ToDo\n\n## Version 3\n* [x] merge `msgpackpp` submodule. rename `msgpack-rpc-asio` to `msgpackpp`\n* [ ] `c++20` co_await\n* [ ] error handling\n* [x] no throw API\n* [ ] use `std::span`. (using std::string_view)\n* [x] merge body_index \u0026 body_size\n\n## Version 2\n\n* [x] `c++11` std::promise/future\n* [x] use https://github.com/ousttrue/msgpackpp backend\n* [x] fix unittest\n\n# unittest framework\n- https://github.com/philsquared/Catch\n\n# usage\n[samples/basic/basic.cpp](./samples/basic/basic.cpp)\n\n```c++\n#include \u003cmsgpackpp.h\u003e\n#include \u003ciostream\u003e\n\nint main(int argc, char **argv)\n{\n    // pack\n    //auto packer = msgpackpp::packer(); // delete copy constructor\n    msgpackpp::packer packer;\n    packer.pack_array(4);\n    packer.pack_integer(0);\n    packer.pack_integer(256);\n    packer.pack_str(\"method\");\n    packer.pack_map(3);\n    packer.pack_str(\"x\"); packer.pack_float(1.0f);\n    packer.pack_str(\"y\"); packer.pack_float(2.0f);\n    packer.pack_str(\"z\"); packer.pack_float(3.0f);\n\n    // std::vector\u003cstd::uint8_t\u003e\n    auto p = packer.get_payload();\n\n    // unpack\n    auto u = msgpackpp::parser(p);\n    std::cout \u003c\u003c u.to_json() \u003c\u003c std::endl; // json style for debug\n\n    std::cout \u003c\u003c u.is_array() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[0].get_number\u003cint\u003e() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[1].get_number\u003cint\u003e() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[2].get_string() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[3].is_map() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[3][\"x\"].get_number\u003cfloat\u003e() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[3][\"y\"].get_number\u003cfloat\u003e() \u003c\u003c std::endl;\n    std::cout \u003c\u003c u[3][\"z\"].get_number\u003cfloat\u003e() \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n```\n[0,256,\"method\",{\"x\":1,\"y\":2,\"z\":3}]\n1\n0\n256\nmethod\n1\n1\n2\n3\n```\n\nsee [tests](tests/tests.cpp).\n\n# implemented types\n\n| c++ type                      | packer                     | parser                                      |\n|-------------------------------|----------------------------|---------------------------------------------|\n| ``(void)``                    | ``packer.pack_nil()``      | ``(parser.is_nil())``                       |\n| ``bool``                      | ``packer.pack_bool(b)``    | ``parser.get_bool()``                       |\n| ``char``                      | ``packer.pack_integer(n)`` | ``parser.get_number\u003cchar\u003e()``               |\n| ``short``                     | ``packer.pack_integer(n)`` | ``parser.get_number\u003cshort\u003e()``              |\n| ``int``                       | ``packer.pack_integer(n)`` | ``parser.get_number\u003cint\u003e()``                |\n| ``long long``                 | ``packer.pack_integer(n)`` | ``parser.get_number\u003clong long\u003e()``          |\n| ``unsigned char``             | ``packer.pack_integer(n)`` | ``parser.get_number\u003cunsigned char\u003e()``      |\n| ``unsigned short``            | ``packer.pack_integer(n)`` | ``parser.get_number\u003cunsigned short\u003e()``     |\n| ``unsigned int``              | ``packer.pack_integer(n)`` | ``parser.get_number\u003cunsigned int\u003e()``       |\n| ``unsigned long long``        | ``packer.pack_integer(n)`` | ``parser.get_number\u003cunsigned long long\u003e()`` |\n| ``float``                     | ``packer.pack_float(n)``   | ``parser.get_number\u003cfloat\u003e()``              |\n| ``double``                    | ``packer.pack_double(n)``  | ``parser.get_number\u003cdouble\u003e()``             |\n| ``const char *``              | ``packer.pack_str(str)``   |                                             |\n| ``std::string``               | ``packer.pack_str(str)``   | ``parser.get_str()``                        |\n| ``std::vector\u003cstd::uint8_t\u003e`` | ``packer.pack_bin(bin)``   | ``parser.get_bin()``                        |\n| ``std::tuple\u003cA...\u003e``          | ``packer \u003c\u003c t``            | `` parser \u003e\u003e t``                            |\n\n# usertype serializer \u0026 deserializer definition\n\n## map type\n\ndepends on element name.\n\n```cpp\nstruct Person\n{\n    std::string name;\n    int age;\n\n    bool operator==(const Person \u0026rhs)const\n    {\n        return name == rhs.name \u0026\u0026 age == rhs.age;\n    }\n};\n```\n\njson representation.\n\n```json\n{\n    \"name\": \"hoge\",\n    \"age\": 100,\n}\n```\n\n```cpp\nnamespace msgpackpp\n{\n    // Person p;\n    // msgpackpp::packer packer;\n    // packer \u003c\u003c p;\n    void serialize(packer \u0026packer, const Person \u0026p)\n    {\n        packer.pack_map(2) \n            \u003c\u003c \"name\" \u003c\u003c p.name\n            \u003c\u003c \"age\" \u003c\u003c p.age\n            ;\n    }\n\n    //  auto parser=msgpackpp::parser(msgpack_bytes);\n    //  Person p;\n    //  parser \u003e\u003e p;\n    parser deserialize(const parser \u0026u, Person \u0026p)\n    {\n        auto uu = u[0];\n        auto count = u.count();\n        for (int i = 0; i\u003ccount; ++i)\n        {\n            auto key = uu.get_string();\n            uu = uu.next();\n\n            if (key == \"name\") {\n                uu \u003e\u003e p.name;\n            }\n            else if (key == \"age\") {\n                uu \u003e\u003e p.age;\n            }\n            else {\n                // unknown key\n                assert(false);\n            }\n            uu = uu.next();\n        }\n        return uu;\n    }\n}\n```\n\nuse helper macro.\n\n```\nMPPP_MAP_SERIALIZER(Person, 2, name, age)\n```\n\n## array type\n\ndepends on element order.\n\n```cpp\nstruct Point\n{\n    float x;\n    float y;\n\n    bool operator==(const Point \u0026rhs)const\n    {\n        return x == rhs.x \u0026\u0026 y == rhs.y;\n    }\n};\n```\n\njson representation.\n\n```json\n[1.0, 2.0] // [x, y]\n```\n\n```cpp\nnamespace msgpackpp\n{\n    // Point p;\n    // msgpackpp::packer packer;\n    // packer \u003c\u003c p;\n    void serialize(packer \u0026packer, const Point \u0026p)\n    {\n        packer.pack_array(2) \n            \u003c\u003c p.x\n            \u003c\u003c p.y\n            ;\n    }\n\n    //  auto parser=msgpackpp::parser(msgpack_bytes);\n    //  Point p;\n    //  parser \u003e\u003e p;\n    parser deserialize(const parser \u0026u, Point \u0026p)\n    {\n        assert(u.count() == 2);\n\n        auto uu = u[0];\n\n        uu \u003e\u003e p.x;\n        uu = uu.next();\n\n        uu \u003e\u003e p.y;\n        uu = uu.next();\n\n        return uu;\n    }\n}\n```\n\nuse helper macro.\n```\nMPPP_ARRAY_SERIALIZER(Point, 2, x, y);\n```\n\n# procedure call\n\nfor rpc implementation.\n\n```cpp\nauto callback=[](int a, int b){ return a+b; }\nauto proc = msgpackpp::make_procedurecall(callback);\nmsgpackpp::packer packer;\npacker \u003c\u003c std::make_tuple(1, 2);\nauto result = proc(packer.get_payload());\n\nR value;\nmsgpackpp::parser(result) \u003e\u003e value; // value=3\n```\n\n- https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md\n\n```cpp\nint id=1;\nauto p = msgpackpp::make_rpc_request(id, \"method\", 1, 2, 3);\n// [0, 1, \"method\", [1, 2, 3]]\n```\n","funding_links":[],"categories":["C++"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fousttrue%2Fmsgpackpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fousttrue%2Fmsgpackpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fousttrue%2Fmsgpackpp/lists"}