atproto utils for zig zat.dev
atproto sdk zig
Something went wrong. Try again.
Zig
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213const std = @import("std");const cbor = @import("cbor.zig");
const writeArg = cbor.writeArg;const writeText = cbor.writeText;const writeBytes = cbor.writeBytes;const writeUint = cbor.writeUint;const writeInt = cbor.writeInt;const writeMapHeader = cbor.writeMapHeader;const writeArrayHeader = cbor.writeArrayHeader;const writeBool = cbor.writeBool;const writeNull = cbor.writeNull;const writeCidLink = cbor.writeCidLink;
const readArg = cbor.readArg;const readText = cbor.readText;const readBytes = cbor.readBytes;const readUint = cbor.readUint;const readInt = cbor.readInt;const readBool = cbor.readBool;const readNull = cbor.readNull;const readMapHeader = cbor.readMapHeader;const readArrayHeader = cbor.readArrayHeader;const readCidLink = cbor.readCidLink;
const decodeAll = cbor.decodeAll;
// ===========================================================================// writeArg// ===========================================================================
test "writeArg: value 0 (1 byte)" { var buf: [16]u8 = undefined; const end = writeArg(&buf, 0, 0, 0); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0x00), buf[0]);}
test "writeArg: value 23 (1 byte)" { var buf: [16]u8 = undefined; const end = writeArg(&buf, 0, 0, 23); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0x17), buf[0]);}
test "writeArg: value 24 (2 bytes)" { var buf: [16]u8 = undefined; const end = writeArg(&buf, 0, 0, 24); try std.testing.expectEqual(@as(usize, 2), end); try std.testing.expectEqual(@as(u8, 0x18), buf[0]); try std.testing.expectEqual(@as(u8, 24), buf[1]);}
test "writeArg: value 1000 (3 bytes)" { var buf: [16]u8 = undefined; const end = writeArg(&buf, 0, 0, 1000); try std.testing.expectEqual(@as(usize, 3), end); try std.testing.expectEqual(@as(u8, 0x19), buf[0]); try std.testing.expectEqual(@as(u8, 0x03), buf[1]); try std.testing.expectEqual(@as(u8, 0xe8), buf[2]);}
// ===========================================================================// writeText round-trip// ===========================================================================
test "writeText: 'hello' round-trip" { var buf: [64]u8 = undefined; const end = writeText(&buf, 0, "hello"); const result = try readText(&buf, 0); try std.testing.expectEqualStrings("hello", result.val); try std.testing.expectEqual(end, result.end);}
// ===========================================================================// writeBytes round-trip// ===========================================================================
test "writeBytes: [1,2,3] round-trip" { var buf: [64]u8 = undefined; const input = [_]u8{ 1, 2, 3 }; const end = writeBytes(&buf, 0, &input); const result = try readBytes(&buf, 0); try std.testing.expectEqual(@as(usize, 3), result.val.len); try std.testing.expectEqual(@as(u8, 1), result.val[0]); try std.testing.expectEqual(@as(u8, 2), result.val[1]); try std.testing.expectEqual(@as(u8, 3), result.val[2]); try std.testing.expectEqual(end, result.end);}
// ===========================================================================// writeUint round-trip// ===========================================================================
test "writeUint: 42 round-trip" { var buf: [16]u8 = undefined; const end = writeUint(&buf, 0, 42); const result = try readUint(&buf, 0); try std.testing.expectEqual(@as(u64, 42), result.val); try std.testing.expectEqual(end, result.end);}
// ===========================================================================// writeInt// ===========================================================================
test "writeInt: -10 verify bytes" { var buf: [16]u8 = undefined; const end = writeInt(&buf, 0, -10); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0x29), buf[0]);}
test "writeInt: positive 42 round-trip" { var buf: [16]u8 = undefined; const end = writeInt(&buf, 0, 42); const result = try readInt(&buf, 0); try std.testing.expectEqual(@as(i64, 42), result.val); try std.testing.expectEqual(end, result.end);}
// ===========================================================================// writeMapHeader// ===========================================================================
test "writeMapHeader: count 3 verify byte" { var buf: [16]u8 = undefined; const end = writeMapHeader(&buf, 0, 3); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0xa3), buf[0]);}
// ===========================================================================// writeArrayHeader// ===========================================================================
test "writeArrayHeader: count 2 verify byte" { var buf: [16]u8 = undefined; const end = writeArrayHeader(&buf, 0, 2); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0x82), buf[0]);}
// ===========================================================================// writeBool// ===========================================================================
test "writeBool: true and false consecutive" { var buf: [16]u8 = undefined; var p = writeBool(&buf, 0, true); p = writeBool(&buf, p, false); try std.testing.expectEqual(@as(u8, 0xf5), buf[0]); try std.testing.expectEqual(@as(u8, 0xf4), buf[1]); try std.testing.expectEqual(@as(usize, 2), p);
const r1 = try readBool(&buf, 0); try std.testing.expectEqual(true, r1.val); const r2 = try readBool(&buf, r1.end); try std.testing.expectEqual(false, r2.val);}
// ===========================================================================// writeNull// ===========================================================================
test "writeNull: verify byte" { var buf: [16]u8 = undefined; const end = writeNull(&buf, 0); try std.testing.expectEqual(@as(usize, 1), end); try std.testing.expectEqual(@as(u8, 0xf6), buf[0]); // round-trip const read_end = try readNull(&buf, 0); try std.testing.expectEqual(end, read_end);}
// ===========================================================================// writeCidLink round-trip// ===========================================================================
test "writeCidLink: round-trip" { var buf: [128]u8 = undefined; const cid_raw = [_]u8{ 0x01, 0x71, 0x12, 0x20 } ++ [_]u8{0xaa} ** 32; const end = writeCidLink(&buf, 0, &cid_raw); const result = try readCidLink(&buf, 0); try std.testing.expectEqual(@as(usize, 36), result.val.len); try std.testing.expectEqualSlices(u8, &cid_raw, result.val); try std.testing.expectEqual(end, result.end);}
// ===========================================================================// Full record: manually write {"text": "hello", "value": 42} then decodeAll// ===========================================================================
test "full record: write map then decodeAll" { var buf: [128]u8 = undefined; // DAG-CBOR sorts keys by length then lex: "text" (4) < "value" (5) var p: usize = 0; p = writeMapHeader(&buf, p, 2); p = writeText(&buf, p, "text"); p = writeText(&buf, p, "hello"); p = writeText(&buf, p, "value"); p = writeUint(&buf, p, 42);
const encoded = buf[0..p];
var arena = std.heap.ArenaAllocator.init(std.testing.allocator); defer arena.deinit(); const decoded = try decodeAll(arena.allocator(), encoded);
try std.testing.expectEqualStrings("hello", decoded.getString("text").?); try std.testing.expectEqual(@as(u64, 42), decoded.getUint("value").?);}