msgpack clib System & Utilities

MessagePack binary serialization. Pack, Unpack, faster and smaller than JSON.

ppm install msgpack

Overview

msgpack wraps MessagePack — a binary serialization format compatible with Python, Go, Rust, JavaScript, and 50+ other languages. It is typically 20–50% smaller than equivalent JSON and 2–10x faster to encode/decode.

JSONText, ~100 bytes
msgpackBinary, ~65 bytes
protobufBinary, ~50 bytes (schema)

Quick Start

uses msgpack;

// Build a value tree
var m := MsgMap;
MapSet(m, 'name',  MsgString('Alice'));
MapSet(m, 'age',   MsgInt(30));
MapSet(m, 'score', MsgFloat(98.5));
MapSet(m, 'active', MsgBool(True));

var tags := MsgArray;
ArrayAdd(tags, MsgString('admin'));
ArrayAdd(tags, MsgString('user'));
MapSet(m, 'tags', tags);

// Serialize to binary
var bytes := Pack(m);
WriteLn('Size: ', Length(bytes), ' bytes');

// Deserialize
var v := Unpack(bytes);
WriteLn('Name: ', AsString(MapGet(v, 'name')));
WriteLn('Age:  ', AsInt(MapGet(v, 'age')));

FreeValue(m);
FreeValue(v);

Type Inspection

var v := Unpack(data);
case ValueKind(v) of
  mkString: WriteLn('String: ', AsString(v));
  mkInt:    WriteLn('Int:    ', AsInt(v));
  mkFloat:  WriteLn('Float:  ', AsFloat(v):0:4);
  mkBool:   WriteLn('Bool:   ', AsBoolean(v));
  mkNil:    WriteLn('Nil');
  mkArray:  WriteLn('Array[', ArrayLen(v), ']');
  mkMap:    begin
    var keys := MapKeys(v);
    for I := 0 to Length(keys)-1 do
      WriteLn(keys[I], ': ', AsString(MapGet(v, keys[I])));
  end;
end;

Float Arrays — Vector Embeddings

// Efficient packing of float vectors (e.g. ML embeddings)
var embedding: array of Double;
// ... fill 1536-dim embedding ...

var packed := PackFloatArray(embedding);
WriteLn('Vector packed: ', Length(packed), ' bytes');

// Restore
var restored := UnpackFloatArray(packed);
WriteLn('Dims: ', Length(restored));

JSON Bridge

// Convert JSON → msgpack (no intermediate parsing)
var json   := '{"user":"bob","score":42}';
var packed := JSONToMsgPack(json);

// Convert msgpack → JSON
var back   := MsgPackToJSON(packed);
WriteLn(back);  // {"user":"bob","score":42}

Single-value shortcuts

var bi := PackInt(12345);
var bf := PackFloat(3.14159);
var bs := PackString('hello world');

var i  := AsInt(Unpack(bi));
var f  := AsFloat(Unpack(bf));
var s  := AsString(Unpack(bs));

With ZMQ (send binary messages)

uses msgpack, zmq;

var ctx  := NewContext;
var sock := NewSocket(ctx, ZMQ_REQ);
Connect(sock, TCPEndpoint('localhost', 5555));

// Pack and send
var msg := MsgMap;
MapSet(msg, 'cmd', MsgString('compute'));
MapSet(msg, 'n',   MsgInt(42));
Send(sock, Pack(msg));

// Receive and unpack
var reply := Unpack(Receive(sock));
WriteLn(AsString(MapGet(reply, 'result')));

FreeValue(msg); FreeValue(reply);
CloseSocket(sock); FreeContext(ctx);

Package Info

Version1.0.0
Typeclib
C Librarylibmsgpack
Authorgustavo

Functions

  • Pack / Unpack
  • FreeValue
  • MsgNil / MsgBool
  • MsgInt / MsgUInt
  • MsgFloat / MsgString
  • MsgBytes / MsgArray / MsgMap
  • ArrayAdd / ArrayLen / ArrayGet
  • MapSet / MapGet / MapHas
  • MapKeys / MapLen
  • ValueKind
  • AsBoolean / AsInt / AsFloat
  • AsString / AsBytes / IsNil
  • JSONToMsgPack
  • MsgPackToJSON
  • PackInt / PackFloat / PackString
  • PackFloatArray / UnpackFloatArray
  • PackedSize / MsgPackVersion