╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────╮ │← previous│ ╰──────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │855 if (!params.only(&.{.start})) return null; │ │856 return repoIssueCommentsRoute(pair, issue_id, params.start() orelse return null); │ │857 } │ │858 + if (std.mem.startsWith(u8, tab, discussion_seg)) { │ │859 + const discussion_id = tab[discussion_seg.len..]; │ │860 + if (discussion_id.len == 0) return null; │ │861 + if (segments.peek()) |tail| { │ │862 + if (std.mem.startsWith(u8, tail, comment_seg)) { │ │863 + _ = segments.next(); │ │864 + const comment_id = tail[comment_seg.len..]; │ │865 + if (comment_id.len == 0) return null; │ │866 + const word = params.scanTail(&segments) catch return null; │ │867 + if (word) |last| { │ │868 + if (!params.only(&.{})) return null; │ │869 + if (std.mem.eql(u8, last, "new")) return repoDiscussionCommentNewRoute(pair, discussion_id, comment_id); │ │870 + if (std.mem.eql(u8, last, "edit")) return repoDiscussionCommentEditRoute(pair, discussion_id, comment_id); │ │871 + return null; │ │872 + } │ │873 + if (!params.only(&.{.start})) return null; │ │874 + return repoDiscussionCommentRoute(pair, discussion_id, comment_id, params.start() orelse return null); │ │875 + } │ │876 + } │ │877 + const word = params.scanTail(&segments) catch return null; │ │878 + if (word) |tail| { │ │879 + if (std.mem.eql(u8, tail, "new")) return if (params.only(&.{})) repoDiscussionCommentNewRoute(pair, discussion_id, "") else null; │ │880 + if (std.mem.eql(u8, tail, "edit")) return if (params.only(&.{})) repoDiscussionsEditRoute(pair, discussion_id) else null; │ │881 + if (std.mem.eql(u8, tail, "description")) return if (params.only(&.{})) repoDiscussionsDescriptionRoute(pair, discussion_id) else null;│ │882 + return null; │ │883 + } │ │884 + if (!params.only(&.{.start})) return null; │ │885 + return repoDiscussionCommentsRoute(pair, discussion_id, params.start() orelse return null); │ │886 + } │ │887 if (std.mem.eql(u8, tab, "issues")) { │ │888 // the word is a list view; a filter with neither is never emitted. │ │889 const word = params.scanTail(&segments) catch return null; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │901 if (std.mem.eql(u8, w, "new")) return if (tag_value.len == 0) repoIssuesNewRoute(pair) else null; │ │902 return null; │ │903 } │ │904 + if (std.mem.eql(u8, tab, "discussions")) { │ │905 + const word = params.scanTail(&segments) catch return null; │ │906 + const tag_value = params.values.get(.tag) orelse ""; │ │907 + const view = word orelse return if (params.only(&.{})) repoDiscussionsRoute(pair, "", "") else null; │ │908 + if (!params.only(&.{.tag})) return null; │ │909 + if (std.mem.eql(u8, view, "all")) return repoDiscussionsRoute(pair, tag_value, ""); │ │910 + if (std.mem.eql(u8, view, "tags")) return repoDiscussionsTagsRoute(pair, tag_value); │ │911 + if (std.mem.eql(u8, view, "new")) return if (tag_value.len == 0) repoDiscussionsNewRoute(pair) else null;│ │912 + return null; │ │913 + } │ │914 if (std.mem.eql(u8, tab, "events")) { │ │915 const view = if (segments.next()) |word| │ │916 std.meta.stringToEnum(EventsView, word) orelse return null │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │983 a_i.view == b.repo_issues.view and │ │984 a_i.comments_start == b.repo_issues.comments_start and │ │985 std.mem.eql(u8, a_i.comment.slice(), b.repo_issues.comment.slice()), │ │986 + .repo_discussions => |a_t| std.mem.eql(u8, a_t.name.slice(), b.repo_discussions.name.slice()) and│ │987 + std.mem.eql(u8, a_t.tag.slice(), b.repo_discussions.tag.slice()) and │ │988 + std.mem.eql(u8, a_t.selected.slice(), b.repo_discussions.selected.slice()) and │ │989 + a_t.view == b.repo_discussions.view and │ │990 + a_t.comments_start == b.repo_discussions.comments_start and │ │991 + std.mem.eql(u8, a_t.comment.slice(), b.repo_discussions.comment.slice()), │ │992 .repo_events => |a_e| std.mem.eql(u8, a_e.name.slice(), b.repo_events.name.slice()) and │ │993 a_e.view == b.repo_events.view and │ │994 a_e.kind == b.repo_events.kind and │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────╮ │1857 repo_files_header: Repo.Files.Header.View, │ │1858 repo_commits_header: Repo.Commits.Header.View, │ │1859 repo_issues_header: Repo.Issues.Header, │ │1860 + repo_discussions_header: Repo.Discussions.Header,│ │1861 repo_files: Repo.Files.View, │ │1862 repo_commits: Repo.Commits.View, │ │1863 repo_refs: Repo.Refs.View, │ ╰───────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────╮ │1864 repo_issues: Repo.Issues.View, │ │1865 + repo_discussions: Repo.Discussions.View, │ │1866 repo_events_header: Repo.Events.Header.View,│ │1867 repo_events: Repo.Events.View, │ │1868 repo_comment: Repo.Comment.Item, │ ╰──────────────────────────────────────────────────────╯