X-Git-Url: https://gitweb.ps.run/chirp/blobdiff_plain/d4496703a509fb5ad5352787ae277ebe204195c8..6a5bd646d03ad9796f00b639881c3b3e25ee35f2:/src/main.zig diff --git a/src/main.zig b/src/main.zig index 0b22dbb..2f7fd4c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -166,6 +166,9 @@ fn decode(text: []const u8) !std.BoundedArray(u8, 1024) { } const Chirp = struct { + const PostsPerPage = 10; + const UsersPerPage = 10; + pub fn hash_password(password: []const u8) !PasswordHash { var hash_buffer = try PasswordHash.init(128); @@ -440,6 +443,75 @@ const Chirp = struct { // }}} // html {{{ +pub fn Paginate(comptime T: type) type { + return struct { + const Self = @This(); + + const IterateResult = T.Base.View.Iterator.Result; + + res: *http.Response, + view: T.View, + per_page: u64, + + it: T.Base.View.Iterator, + starting_idx: ?T.Base.Key, + count: u64 = 0, + + pub fn init(res: *http.Response, view: T.View, per_page: u64) !Self { + var it = view.reverse_iterator(); + if (res.req.get_param("starting_at")) |starting_at_str| { + it.idx = try parse_enum(T.Base.Key, starting_at_str, 16); + } + + if (it.idx == null) { + return error.InvalidIterator; + } + + return .{ + .res = res, + .view = view, + .per_page = per_page, + .it = it, + .starting_idx = it.idx.?, + }; + } + pub fn next(self: *Self) IterateResult { + if (self.it.next()) |kv| { + if (self.count < self.per_page) { + self.count += 1; + return kv; + } + } + return null; + } + pub fn write_navigation(self: *Self) !void { + const next_idx = self.it.next(); + + if (self.view.base.head.last != self.starting_idx) { + var prev_it = self.view.iterator(); + prev_it.idx = self.starting_idx.?; + var oldest_idx = self.starting_idx.?; + + var count: u64 = 0; + while (prev_it.next()) |kv| { + oldest_idx = kv.key; + + if (count > self.per_page) { + break; + } else { + count += 1; + } + } + + try self.res.write("Prev ", .{ self.res.req.target, @intFromEnum(oldest_idx) }); + } + + if (next_idx) |kv| { + try self.res.write("Next", .{ self.res.req.target, @intFromEnum(kv.key) }); + } + } + }; +} fn html_form(res: *http.Response, action: []const u8, inputs: anytype) !void { try res.write("
", .{action}); @@ -526,6 +598,7 @@ fn write_start(res: *http.Response) !void { \\ \\ \\ + \\ \\