atproto utils for zig zat.dev
atproto sdk zig
1//! sync types - com.atproto.sync.subscribeRepos 2//! 3//! enums for firehose/event stream consumption. 4//! see: https://atproto.com/specs/event-stream 5 6const std = @import("std"); 7 8/// repo operation action (create/update/delete) 9/// 10/// from com.atproto.sync.subscribeRepos#repoOp 11/// used in firehose commit messages to indicate what happened to a record. 12pub const CommitAction = enum { 13 create, 14 update, 15 delete, 16 17 /// parse from string (for manual parsing) 18 pub fn parse(s: []const u8) ?CommitAction { 19 return std.meta.stringToEnum(CommitAction, s); 20 } 21}; 22 23/// event stream message types 24/// 25/// from com.atproto.sync.subscribeRepos message union 26/// the top-level discriminator for firehose messages. 27pub const EventKind = enum { 28 commit, 29 sync, 30 identity, 31 account, 32 info, 33 34 pub fn parse(s: []const u8) ?EventKind { 35 return std.meta.stringToEnum(EventKind, s); 36 } 37}; 38 39/// account status reasons 40/// 41/// from com.atproto.sync.subscribeRepos#account status field 42/// indicates why an account is inactive. 43pub const AccountStatus = enum { 44 takendown, 45 suspended, 46 deleted, 47 deactivated, 48 desynchronized, 49 throttled, 50 51 pub fn parse(s: []const u8) ?AccountStatus { 52 return std.meta.stringToEnum(AccountStatus, s); 53 } 54}; 55 56// === tests === 57 58test "CommitAction parse" { 59 try std.testing.expectEqual(CommitAction.create, CommitAction.parse("create").?); 60 try std.testing.expectEqual(CommitAction.update, CommitAction.parse("update").?); 61 try std.testing.expectEqual(CommitAction.delete, CommitAction.parse("delete").?); 62 try std.testing.expect(CommitAction.parse("invalid") == null); 63} 64 65test "CommitAction json parsing" { 66 const json_str = 67 \\{"action": "create", "path": "app.bsky.feed.post/abc"} 68 ; 69 70 const Op = struct { 71 action: CommitAction, 72 path: []const u8, 73 }; 74 75 const parsed = try std.json.parseFromSlice(Op, std.testing.allocator, json_str, .{}); 76 defer parsed.deinit(); 77 78 try std.testing.expectEqual(CommitAction.create, parsed.value.action); 79} 80 81test "EventKind parse" { 82 try std.testing.expectEqual(EventKind.commit, EventKind.parse("commit").?); 83 try std.testing.expectEqual(EventKind.identity, EventKind.parse("identity").?); 84 try std.testing.expect(EventKind.parse("unknown") == null); 85} 86 87test "AccountStatus parse" { 88 try std.testing.expectEqual(AccountStatus.takendown, AccountStatus.parse("takendown").?); 89 try std.testing.expectEqual(AccountStatus.suspended, AccountStatus.parse("suspended").?); 90}