BARE Message Encoding implementation in Zig
Update readme
Use latest "stable" Zig for CI on trunk branch
Test on Zig 0.9.0



You can also use your local clone with git send-email.

#zig-bare builds.sr.ht status

BARE Message Encoding implementation in Zig.


The trunk branch is tested on latest stable Zig, and the self-hosted branch is tested with the self-hosted compiler (use -fno-stage1 to build).

# Use -Drelease-{fast, safe, small} for release build.
zig build

# Run tests.
zig build test


Declare your types as usual, then use Encoder to encode them, and Decoder to decode them:

const Foo = union(enum) {
    x: u64,
    y: []const u8,
    z: void,

const Bar = struct {
    a: f32,
    b: u8,
    c: Foo,

const x = Bar{
    .a = 3.14,
    .b = 2,
    .c = Foo{ .y = "hello" },

var buf: [12]u8 = undefined;
var fbs = io.fixedBufferStream(&buf);

try Encoder.init().encode(x, fbs.writer());
try fbs.seekTo(0);
var d = Decoder.init(allocator);
defer d.deinit();
const y = try d.decode(Bar, fbs.reader());
warn("x: {}\ny: {}\n", .{ x, y });

Hash maps and slices require allocation; call deinit on a Decoder to free any memory that was allocated.

#BARE conformance

All BARE types are supported, although data<length> and data are the same as [length]u8 and []u8, and string is also the same as []u8.

For map[type A]type B, std.HashMap is used.

When using Encoder, all BARE invariants are enforced at compile-time.

#Code generation

There is no schema parser or code generation.

I don't need it myself, but I would gladly accept contributions.


Send patches and questions to ~alva/zig-bare@lists.sr.ht.