bsky feeds about music music-atmosphere-feed.plyr.fm/
bsky feed zig
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

use checked xrpc results for appview calls

+49 -12
+2 -2
build.zig.zon
··· 9 9 .hash = "zqlite-0.0.1-RWLaYz6bmAAT7E_jxopXf-j5Ea8VQldnxsd6TU8sa0Bb", 10 10 }, 11 11 .zat = .{ 12 - .url = "https://tangled.org/zat.dev/zat/archive/v0.3.0-alpha.25.tar.gz", 13 - .hash = "zat-0.3.0-alpha.24-5PuC7vB8CACd9OTAS8jDuwVN4hQBYiAdfArjFjo_sWyD", 12 + .url = "https://tangled.sh/zat.dev/zat/archive/8ba4cc0", 13 + .hash = "zat-0.3.0-alpha.24-5PuC7qnqCADBVvlpB-CAlkHqVwTkbYx6HYgU-Fu3HjlQ", 14 14 }, 15 15 }, 16 16 .paths = .{
+47 -10
src/bsky/api.zig
··· 39 39 try params.put("cursor", c); 40 40 } 41 41 42 - var response = client.query(nsid, params) catch |err| { 42 + var query_result = client.queryChecked(nsid, params, .{}) catch |err| { 43 43 log.err("getFollows API error: {}", .{err}); 44 44 return error.ApiFailed; 45 45 }; 46 - defer response.deinit(); 46 + defer query_result.deinit(); 47 47 48 - if (!response.ok()) { 49 - return error.ApiFailed; 50 - } 48 + const response = switch (query_result) { 49 + .ok => |response| response, 50 + .err => |xrpc_error| { 51 + logXrpcError("getFollows", actor_did, xrpc_error); 52 + return error.ApiFailed; 53 + }, 54 + }; 51 55 52 56 var parsed = response.json() catch return error.InvalidJson; 53 57 defer parsed.deinit(); ··· 123 127 try params.put("limit", limit_str); 124 128 try params.put("filter", "posts_no_replies"); 125 129 126 - var response = client.query(nsid, params) catch |err| { 130 + var query_result = client.queryChecked(nsid, params, .{}) catch |err| { 127 131 log.err("getAuthorFeed API error for {s}: {}", .{ actor_did, err }); 128 132 return error.ApiFailed; 129 133 }; 130 - defer response.deinit(); 134 + defer query_result.deinit(); 131 135 132 - if (!response.ok()) { 133 - return error.ApiFailed; 134 - } 136 + const response = switch (query_result) { 137 + .ok => |response| response, 138 + .err => |xrpc_error| { 139 + logXrpcError("getAuthorFeed", actor_did, xrpc_error); 140 + return error.ApiFailed; 141 + }, 142 + }; 135 143 136 144 var parsed = response.json() catch return error.InvalidJson; 137 145 defer parsed.deinit(); ··· 165 173 for (posts_list) |p| freeAuthorPost(alloc, p); 166 174 alloc.free(posts_list); 167 175 } 176 + 177 + fn logXrpcError(comptime operation: []const u8, actor_did: []const u8, xrpc_error: zat.XrpcClient.XrpcError) void { 178 + if (xrpc_error.error_name) |name| { 179 + if (xrpc_error.message) |message| { 180 + log.err("{s} XRPC error for {s}: status={} error={s} message={s}", .{ 181 + operation, 182 + actor_did, 183 + xrpc_error.status, 184 + name, 185 + message, 186 + }); 187 + return; 188 + } 189 + 190 + log.err("{s} XRPC error for {s}: status={} error={s}", .{ 191 + operation, 192 + actor_did, 193 + xrpc_error.status, 194 + name, 195 + }); 196 + return; 197 + } 198 + 199 + log.err("{s} XRPC error for {s}: status={}", .{ 200 + operation, 201 + actor_did, 202 + xrpc_error.status, 203 + }); 204 + }