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}