Switched parameters to square brackets and fixed the tests

This commit is contained in:
Sky Johnson 2025-02-04 11:23:59 -06:00
parent 20089847c2
commit 872fd98c14
3 changed files with 181 additions and 175 deletions

18
node.go
View File

@ -5,7 +5,7 @@ import "strings"
// Node types // Node types
const ( const (
separator = '/' separator = '/'
parameter = ':' parameter = '['
wildcard = '*' wildcard = '*'
) )
@ -119,15 +119,21 @@ func (node *Node[T]) append(path string, data T) {
// If we're directly in front of a parameter, // If we're directly in front of a parameter,
// add a parameter node. // add a parameter node.
if paramStart == 0 { if paramStart == 0 {
paramEnd := strings.IndexByte(path, separator) paramEnd := strings.IndexByte(path[1:], ']')
if paramEnd == -1 { if paramEnd == -1 {
paramEnd = len(path) paramEnd = len(path)
} else {
paramEnd = paramEnd + 1 // Account for the offset from path[1:]
}
nextSep := strings.IndexByte(path[paramEnd+1:], separator)
if nextSep == -1 {
nextSep = len(path[paramEnd+1:])
} }
child := &Node[T]{ child := &Node[T]{
prefix: path[1:paramEnd], prefix: path[1:paramEnd], // Exclude the opening '['
kind: path[paramStart], kind: parameter,
} }
switch child.kind { switch child.kind {
@ -135,7 +141,7 @@ func (node *Node[T]) append(path string, data T) {
child.addTrailingSlash(data) child.addTrailingSlash(data)
node.parameter = child node.parameter = child
node = child node = child
path = path[paramEnd:] path = path[paramEnd+nextSep+1:]
continue continue
case wildcard: case wildcard:

View File

@ -1,4 +1,4 @@
GET / GET /
GET /:slug GET /[slug]
GET /tags GET /tags
GET /tag/:tag GET /tag/[tag]

View File

@ -1,203 +1,203 @@
GET /authorizations GET /authorizations
GET /authorizations/:id GET /authorizations/[id]
POST /authorizations POST /authorizations
DELETE /authorizations/:id DELETE /authorizations/[id]
GET /applications/:client_id/tokens/:access_token GET /applications/[client_id]/tokens/[access_token]
DELETE /applications/:client_id/tokens DELETE /applications/[client_id]/tokens
DELETE /applications/:client_id/tokens/:access_token DELETE /applications/[client_id]/tokens/[access_token]
GET /events GET /events
GET /repos/:owner/:repo/events GET /repos/[owner]/[repo]/events
GET /networks/:owner/:repo/events GET /networks/[owner]/[repo]/events
GET /orgs/:org/events GET /orgs/[org]/events
GET /users/:user/received_events GET /users/[user]/received_events
GET /users/:user/received_events/public GET /users/[user]/received_events/public
GET /users/:user/events GET /users/[user]/events
GET /users/:user/events/public GET /users/[user]/events/public
GET /users/:user/events/orgs/:org GET /users/[user]/events/orgs/[org]
GET /feeds GET /feeds
GET /notifications GET /notifications
GET /repos/:owner/:repo/notifications GET /repos/[owner]/[repo]/notifications
PUT /notifications PUT /notifications
PUT /repos/:owner/:repo/notifications PUT /repos/[owner]/[repo]/notifications
GET /notifications/threads/:id GET /notifications/threads/[id]
GET /notifications/threads/:id/subscription GET /notifications/threads/[id]/subscription
PUT /notifications/threads/:id/subscription PUT /notifications/threads/[id]/subscription
DELETE /notifications/threads/:id/subscription DELETE /notifications/threads/[id]/subscription
GET /repos/:owner/:repo/stargazers GET /repos/[owner]/[repo]/stargazers
GET /users/:user/starred GET /users/[user]/starred
GET /user/starred GET /user/starred
GET /user/starred/:owner/:repo GET /user/starred/[owner]/[repo]
PUT /user/starred/:owner/:repo PUT /user/starred/[owner]/[repo]
DELETE /user/starred/:owner/:repo DELETE /user/starred/[owner]/[repo]
GET /repos/:owner/:repo/subscribers GET /repos/[owner]/[repo]/subscribers
GET /users/:user/subscriptions GET /users/[user]/subscriptions
GET /user/subscriptions GET /user/subscriptions
GET /repos/:owner/:repo/subscription GET /repos/[owner]/[repo]/subscription
PUT /repos/:owner/:repo/subscription PUT /repos/[owner]/[repo]/subscription
DELETE /repos/:owner/:repo/subscription DELETE /repos/[owner]/[repo]/subscription
GET /user/subscriptions/:owner/:repo GET /user/subscriptions/[owner]/[repo]
PUT /user/subscriptions/:owner/:repo PUT /user/subscriptions/[owner]/[repo]
DELETE /user/subscriptions/:owner/:repo DELETE /user/subscriptions/[owner]/[repo]
GET /users/:user/gists GET /users/[user]/gists
GET /gists GET /gists
GET /gists/:id GET /gists/[id]
POST /gists POST /gists
PUT /gists/:id/star PUT /gists/[id]/star
DELETE /gists/:id/star DELETE /gists/[id]/star
GET /gists/:id/star GET /gists/[id]/star
POST /gists/:id/forks POST /gists/[id]/forks
DELETE /gists/:id DELETE /gists/[id]
GET /repos/:owner/:repo/git/blobs/:sha GET /repos/[owner]/[repo]/git/blobs/[sha]
POST /repos/:owner/:repo/git/blobs POST /repos/[owner]/[repo]/git/blobs
GET /repos/:owner/:repo/git/commits/:sha GET /repos/[owner]/[repo]/git/commits/[sha]
POST /repos/:owner/:repo/git/commits POST /repos/[owner]/[repo]/git/commits
GET /repos/:owner/:repo/git/refs GET /repos/[owner]/[repo]/git/refs
POST /repos/:owner/:repo/git/refs POST /repos/[owner]/[repo]/git/refs
GET /repos/:owner/:repo/git/tags/:sha GET /repos/[owner]/[repo]/git/tags/[sha]
POST /repos/:owner/:repo/git/tags POST /repos/[owner]/[repo]/git/tags
GET /repos/:owner/:repo/git/trees/:sha GET /repos/[owner]/[repo]/git/trees/[sha]
POST /repos/:owner/:repo/git/trees POST /repos/[owner]/[repo]/git/trees
GET /issues GET /issues
GET /user/issues GET /user/issues
GET /orgs/:org/issues GET /orgs/[org]/issues
GET /repos/:owner/:repo/issues GET /repos/[owner]/[repo]/issues
GET /repos/:owner/:repo/issues/:number GET /repos/[owner]/[repo]/issues/[number]
POST /repos/:owner/:repo/issues POST /repos/[owner]/[repo]/issues
GET /repos/:owner/:repo/assignees GET /repos/[owner]/[repo]/assignees
GET /repos/:owner/:repo/assignees/:assignee GET /repos/[owner]/[repo]/assignees/[assignee]
GET /repos/:owner/:repo/issues/:number/comments GET /repos/[owner]/[repo]/issues/[number]/comments
POST /repos/:owner/:repo/issues/:number/comments POST /repos/[owner]/[repo]/issues/[number]/comments
GET /repos/:owner/:repo/issues/:number/events GET /repos/[owner]/[repo]/issues/[number]/events
GET /repos/:owner/:repo/labels GET /repos/[owner]/[repo]/labels
GET /repos/:owner/:repo/labels/:name GET /repos/[owner]/[repo]/labels/[name]
POST /repos/:owner/:repo/labels POST /repos/[owner]/[repo]/labels
DELETE /repos/:owner/:repo/labels/:name DELETE /repos/[owner]/[repo]/labels/[name]
GET /repos/:owner/:repo/issues/:number/labels GET /repos/[owner]/[repo]/issues/[number]/labels
POST /repos/:owner/:repo/issues/:number/labels POST /repos/[owner]/[repo]/issues/[number]/labels
DELETE /repos/:owner/:repo/issues/:number/labels/:name DELETE /repos/[owner]/[repo]/issues/[number]/labels/[name]
PUT /repos/:owner/:repo/issues/:number/labels PUT /repos/[owner]/[repo]/issues/[number]/labels
DELETE /repos/:owner/:repo/issues/:number/labels DELETE /repos/[owner]/[repo]/issues/[number]/labels
GET /repos/:owner/:repo/milestones/:number/labels GET /repos/[owner]/[repo]/milestones/[number]/labels
GET /repos/:owner/:repo/milestones GET /repos/[owner]/[repo]/milestones
GET /repos/:owner/:repo/milestones/:number GET /repos/[owner]/[repo]/milestones/[number]
POST /repos/:owner/:repo/milestones POST /repos/[owner]/[repo]/milestones
DELETE /repos/:owner/:repo/milestones/:number DELETE /repos/[owner]/[repo]/milestones/[number]
GET /emojis GET /emojis
GET /gitignore/templates GET /gitignore/templates
GET /gitignore/templates/:name GET /gitignore/templates/[name]
POST /markdown POST /markdown
POST /markdown/raw POST /markdown/raw
GET /meta GET /meta
GET /rate_limit GET /rate_limit
GET /users/:user/orgs GET /users/[user]/orgs
GET /user/orgs GET /user/orgs
GET /orgs/:org GET /orgs/[org]
GET /orgs/:org/members GET /orgs/[org]/members
GET /orgs/:org/members/:user GET /orgs/[org]/members/[user]
DELETE /orgs/:org/members/:user DELETE /orgs/[org]/members/[user]
GET /orgs/:org/public_members GET /orgs/[org]/public_members
GET /orgs/:org/public_members/:user GET /orgs/[org]/public_members/[user]
PUT /orgs/:org/public_members/:user PUT /orgs/[org]/public_members/[user]
DELETE /orgs/:org/public_members/:user DELETE /orgs/[org]/public_members/[user]
GET /orgs/:org/teams GET /orgs/[org]/teams
GET /teams/:id GET /teams/[id]
POST /orgs/:org/teams POST /orgs/[org]/teams
DELETE /teams/:id DELETE /teams/[id]
GET /teams/:id/members GET /teams/[id]/members
GET /teams/:id/members/:user GET /teams/[id]/members/[user]
PUT /teams/:id/members/:user PUT /teams/[id]/members/[user]
DELETE /teams/:id/members/:user DELETE /teams/[id]/members/[user]
GET /teams/:id/repos GET /teams/[id]/repos
GET /teams/:id/repos/:owner/:repo GET /teams/[id]/repos/[owner]/[repo]
PUT /teams/:id/repos/:owner/:repo PUT /teams/[id]/repos/[owner]/[repo]
DELETE /teams/:id/repos/:owner/:repo DELETE /teams/[id]/repos/[owner]/[repo]
GET /user/teams GET /user/teams
GET /repos/:owner/:repo/pulls GET /repos/[owner]/[repo]/pulls
GET /repos/:owner/:repo/pulls/:number GET /repos/[owner]/[repo]/pulls/[number]
POST /repos/:owner/:repo/pulls POST /repos/[owner]/[repo]/pulls
GET /repos/:owner/:repo/pulls/:number/commits GET /repos/[owner]/[repo]/pulls/[number]/commits
GET /repos/:owner/:repo/pulls/:number/files GET /repos/[owner]/[repo]/pulls/[number]/files
GET /repos/:owner/:repo/pulls/:number/merge GET /repos/[owner]/[repo]/pulls/[number]/merge
PUT /repos/:owner/:repo/pulls/:number/merge PUT /repos/[owner]/[repo]/pulls/[number]/merge
GET /repos/:owner/:repo/pulls/:number/comments GET /repos/[owner]/[repo]/pulls/[number]/comments
PUT /repos/:owner/:repo/pulls/:number/comments PUT /repos/[owner]/[repo]/pulls/[number]/comments
GET /user/repos GET /user/repos
GET /users/:user/repos GET /users/[user]/repos
GET /orgs/:org/repos GET /orgs/[org]/repos
GET /repositories GET /repositories
POST /user/repos POST /user/repos
POST /orgs/:org/repos POST /orgs/[org]/repos
GET /repos/:owner/:repo GET /repos/[owner]/[repo]
GET /repos/:owner/:repo/contributors GET /repos/[owner]/[repo]/contributors
GET /repos/:owner/:repo/languages GET /repos/[owner]/[repo]/languages
GET /repos/:owner/:repo/teams GET /repos/[owner]/[repo]/teams
GET /repos/:owner/:repo/tags GET /repos/[owner]/[repo]/tags
GET /repos/:owner/:repo/branches GET /repos/[owner]/[repo]/branches
GET /repos/:owner/:repo/branches/:branch GET /repos/[owner]/[repo]/branches/[branch]
DELETE /repos/:owner/:repo DELETE /repos/[owner]/[repo]
GET /repos/:owner/:repo/collaborators GET /repos/[owner]/[repo]/collaborators
GET /repos/:owner/:repo/collaborators/:user GET /repos/[owner]/[repo]/collaborators/[user]
PUT /repos/:owner/:repo/collaborators/:user PUT /repos/[owner]/[repo]/collaborators/[user]
DELETE /repos/:owner/:repo/collaborators/:user DELETE /repos/[owner]/[repo]/collaborators/[user]
GET /repos/:owner/:repo/comments GET /repos/[owner]/[repo]/comments
GET /repos/:owner/:repo/commits/:sha/comments GET /repos/[owner]/[repo]/commits/[sha]/comments
POST /repos/:owner/:repo/commits/:sha/comments POST /repos/[owner]/[repo]/commits/[sha]/comments
GET /repos/:owner/:repo/comments/:id GET /repos/[owner]/[repo]/comments/[id]
DELETE /repos/:owner/:repo/comments/:id DELETE /repos/[owner]/[repo]/comments/[id]
GET /repos/:owner/:repo/commits GET /repos/[owner]/[repo]/commits
GET /repos/:owner/:repo/commits/:sha GET /repos/[owner]/[repo]/commits/[sha]
GET /repos/:owner/:repo/readme GET /repos/[owner]/[repo]/readme
GET /repos/:owner/:repo/keys GET /repos/[owner]/[repo]/keys
GET /repos/:owner/:repo/keys/:id GET /repos/[owner]/[repo]/keys/[id]
POST /repos/:owner/:repo/keys POST /repos/[owner]/[repo]/keys
DELETE /repos/:owner/:repo/keys/:id DELETE /repos/[owner]/[repo]/keys/[id]
GET /repos/:owner/:repo/downloads GET /repos/[owner]/[repo]/downloads
GET /repos/:owner/:repo/downloads/:id GET /repos/[owner]/[repo]/downloads/[id]
DELETE /repos/:owner/:repo/downloads/:id DELETE /repos/[owner]/[repo]/downloads/[id]
GET /repos/:owner/:repo/forks GET /repos/[owner]/[repo]/forks
POST /repos/:owner/:repo/forks POST /repos/[owner]/[repo]/forks
GET /repos/:owner/:repo/hooks GET /repos/[owner]/[repo]/hooks
GET /repos/:owner/:repo/hooks/:id GET /repos/[owner]/[repo]/hooks/[id]
POST /repos/:owner/:repo/hooks POST /repos/[owner]/[repo]/hooks
POST /repos/:owner/:repo/hooks/:id/tests POST /repos/[owner]/[repo]/hooks/[id]/tests
DELETE /repos/:owner/:repo/hooks/:id DELETE /repos/[owner]/[repo]/hooks/[id]
POST /repos/:owner/:repo/merges POST /repos/[owner]/[repo]/merges
GET /repos/:owner/:repo/releases GET /repos/[owner]/[repo]/releases
GET /repos/:owner/:repo/releases/:id GET /repos/[owner]/[repo]/releases/[id]
POST /repos/:owner/:repo/releases POST /repos/[owner]/[repo]/releases
DELETE /repos/:owner/:repo/releases/:id DELETE /repos/[owner]/[repo]/releases/[id]
GET /repos/:owner/:repo/releases/:id/assets GET /repos/[owner]/[repo]/releases/[id]/assets
GET /repos/:owner/:repo/stats/contributors GET /repos/[owner]/[repo]/stats/contributors
GET /repos/:owner/:repo/stats/commit_activity GET /repos/[owner]/[repo]/stats/commit_activity
GET /repos/:owner/:repo/stats/code_frequency GET /repos/[owner]/[repo]/stats/code_frequency
GET /repos/:owner/:repo/stats/participation GET /repos/[owner]/[repo]/stats/participation
GET /repos/:owner/:repo/stats/punch_card GET /repos/[owner]/[repo]/stats/punch_card
GET /repos/:owner/:repo/statuses/:ref GET /repos/[owner]/[repo]/statuses/[ref]
POST /repos/:owner/:repo/statuses/:ref POST /repos/[owner]/[repo]/statuses/[ref]
GET /search/repositories GET /search/repositories
GET /search/code GET /search/code
GET /search/issues GET /search/issues
GET /search/users GET /search/users
GET /legacy/issues/search/:owner/:repository/:state/:keyword GET /legacy/issues/search/[owner]/[repository]/[state]/[keyword]
GET /legacy/repos/search/:keyword GET /legacy/repos/search/[keyword]
GET /legacy/user/search/:keyword GET /legacy/user/search/[keyword]
GET /legacy/user/email/:email GET /legacy/user/email/[email]
GET /users/:user GET /users/[user]
GET /user GET /user
GET /users GET /users
GET /user/emails GET /user/emails
POST /user/emails POST /user/emails
DELETE /user/emails DELETE /user/emails
GET /users/:user/followers GET /users/[user]/followers
GET /user/followers GET /user/followers
GET /users/:user/following GET /users/[user]/following
GET /user/following GET /user/following
GET /user/following/:user GET /user/following/[user]
GET /users/:user/following/:target_user GET /users/[user]/following/[target_user]
PUT /user/following/:user PUT /user/following/[user]
DELETE /user/following/:user DELETE /user/following/[user]
GET /users/:user/keys GET /users/[user]/keys
GET /user/keys GET /user/keys
GET /user/keys/:id GET /user/keys/[id]
POST /user/keys POST /user/keys
DELETE /user/keys/:id DELETE /user/keys/[id]