MCPcopy Index your code
hub / github.com/3Hren/msgpack-rust

github.com/3Hren/msgpack-rust @v0.6.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.6.0 ↗ · + Follow
662 symbols 1,164 edges 40 files 92 documented · 14%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

RMP - Rust MessagePack

RMP is a pure Rust MessagePack implementation.

Build Status Coverage Status

Usage

To use rmp, first add this to your Cargo.toml:

[dependencies.rmp]
rmp = "0.6.0"

Then, add this to your crate root:

extern crate rmp as msgpack;

Features

  • Convenient API

RMP is designed to be lightweight and straightforward. There are low-level API, which gives you full control on data encoding/decoding process and makes no heap allocations. On the other hand there are high-level API, which provides you convenient interface using Rust standard library and compiler reflection, allowing to encode/decode structures using derive attribute.

  • Zero-copy value decoding

RMP allows to decode bytes from a buffer in a zero-copy manner easily and blazingly fast, while Rust static checks guarantees that the data will be valid until buffer lives.

  • Clear error handling

RMP's error system guarantees that you never receive an error enum with unreachable variant.

  • Robust and tested

This project is developed using TDD and CI, so any found bugs will be fixed without breaking existing functionality.

Examples

Let's try to encode a tuple of int and string.

extern crate rmp as msgpack;
extern crate rustc_serialize;

use rustc_serialize::Encodable;
use msgpack::Encoder;

fn main() {
    let val = (42u8, "the Answer");

    // The encoder borrows the bytearray buffer.
    let mut buf = [0u8; 13];

    val.encode(&mut Encoder::new(&mut &mut buf[..]));

    assert_eq!([0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72], buf);
}

Now we have an encoded buffer, which we can decode the same way:

extern crate rmp as msgpack;
extern crate rustc_serialize;

use rustc_serialize::Decodable;
use msgpack::Decoder;

fn main() {
    let buf = [0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72];

    let mut decoder = Decoder::new(&buf[..]);

    let res: (u8, String) = Decodable::decode(&mut decoder).unwrap();

    assert_eq!((42u8, "the Answer".to_string()), res);
}

RMP also allows to automatically serialize/deserialize custom structures using rustc_serialize reflection. To enable this feature, derive RustcEncodable and RustcDecodable attributes as shown in the following example:

extern crate rmp as msgpack;
extern crate rustc_serialize;

use rustc_serialize::{Encodable, Decodable};
use msgpack::{Encoder, Decoder};

#[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
struct Custom {
    id: u32,
    key: String,
}

fn main() {
    let val = Custom { id: 42u32, key: "the Answer".to_string() };

    let mut buf = [0u8; 13];

    val.encode(&mut Encoder::new(&mut &mut buf[..]));

    assert_eq!([0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72], buf);

    // Now try to unpack the buffer into the initial struct.
    let mut decoder = Decoder::new(&buf[..]);
    let res: Custom = Decodable::decode(&mut decoder).ok().unwrap();

    assert_eq!(val, res);
}

Versioning

This project adheres to Semantic Versioning. However until 1.0.0 comes there will be the following rules:

  • Any API/ABI breaking changes will be notified in the changelog explicitly and results in minor version bumping.
  • API extending features results in minor version bumping.
  • Non-breaking bug fixes and performance improving results in patch version bumping.

Extension points exported contracts — how you extend this code

BigEndianRead (Interface)
(no doc) [10 implementers]
src/decode.rs
BorrowRead (Interface)
A BorrowRead is a type of Reader which has an internal buffer. This magic trait acts like a standard BufRead but unlike [3 …
src/decode/value_ref.rs
ToUnsigned (Interface)
(no doc) [3 implementers]
src/decode/value_ref.rs

Core symbols most depended-on inside this repo

read_numeric_data
called by 46
src/decode.rs
write_marker
called by 28
src/encode.rs
read_marker
called by 28
src/decode.rs
read_value_ref
called by 16
src/decode/value_ref.rs
read_len
called by 13
src/decode/value_ref.rs
write_fixval
called by 12
src/encode.rs
write_array_len
called by 12
src/encode.rs
read_num
called by 10
src/decode/value_ref.rs

Shape

Function 480
Method 142
Class 19
Enum 18
Interface 3

Languages

Rust100%

Modules by API surface

src/decode.rs114 symbols
src/encode.rs102 symbols
tests/func/decode/value_ref.rs54 symbols
tests/func/decode/int.rs47 symbols
tests/func/decode/deserializer.rs37 symbols
tests/func/decode/decoder.rs36 symbols
tests/func/encode/serializer.rs31 symbols
tests/func/encode/encoder.rs30 symbols
tests/func/encode/int.rs27 symbols
src/decode/value_ref.rs23 symbols
tests/func/decode/string.rs21 symbols
tests/func/encode/value_ref.rs13 symbols

For agents

$ claude mcp add msgpack-rust \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact