feat(routing): add api to access key segments by name

routing
Jef Roosens 2024-02-22 22:31:00 +01:00
parent f652fa08c1
commit 9dbdb0b089
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
3 changed files with 45 additions and 4 deletions

View File

@ -8,13 +8,15 @@
typedef struct lnm_http_route lnm_http_route; typedef struct lnm_http_route lnm_http_route;
typedef struct lnm_http_route_match_segment {
size_t start;
size_t len;
} lnm_http_route_match_segment;
typedef struct lnm_http_route_match { typedef struct lnm_http_route_match {
const lnm_http_route *route; const lnm_http_route *route;
lnm_http_method method; lnm_http_method method;
struct { lnm_http_route_match_segment key_segments[LNM_HTTP_MAX_KEY_SEGMENTS];
size_t start;
size_t len;
} key_segments[LNM_HTTP_MAX_KEY_SEGMENTS];
} lnm_http_route_match; } lnm_http_route_match;
typedef struct lnm_http_router lnm_http_router; typedef struct lnm_http_router lnm_http_router;
@ -47,4 +49,7 @@ lnm_http_route_err lnm_http_router_route(lnm_http_route_match *out,
lnm_http_method method, lnm_http_method method,
const char *path); const char *path);
lnm_err lnm_http_route_match_get(lnm_http_route_match_segment **out,
lnm_http_route_match *match, const char *key);
#endif #endif

View File

@ -268,3 +268,30 @@ lnm_http_route_err lnm_http_router_route(lnm_http_route_match *out,
return __lnm_http_router_route(out, router, method, path, 0, 0); return __lnm_http_router_route(out, router, method, path, 0, 0);
} }
lnm_err lnm_http_route_match_get(lnm_http_route_match_segment **out,
lnm_http_route_match *match, const char *key) {
if (match->route->key_segments == NULL) {
return lnm_err_not_found;
}
lnm_http_route_segment_trie *trie = match->route->key_segments;
while (*key != '\0') {
trie = trie->children[(unsigned char)*key];
if (trie == NULL) {
return lnm_err_not_found;
}
key++;
}
if (!trie->represents_segment) {
return lnm_err_not_found;
}
*out = &match->key_segments[trie->index];
return lnm_err_ok;
}

View File

@ -28,6 +28,15 @@ void test_routing_simple() {
TEST_CHECK(match.key_segments[0].len == 8); TEST_CHECK(match.key_segments[0].len == 8);
TEST_CHECK(match.key_segments[1].start == 15); TEST_CHECK(match.key_segments[1].start == 15);
TEST_CHECK(match.key_segments[1].len == 9); TEST_CHECK(match.key_segments[1].len == 9);
lnm_http_route_match_segment *segment;
TEST_CHECK(lnm_http_route_match_get(&segment, &match, "second") == lnm_err_ok);
TEST_CHECK(segment->start == 15);
TEST_CHECK(segment->len == 9);
TEST_CHECK(lnm_http_route_match_get(&segment, &match, "yuhh") == lnm_err_not_found);
TEST_CHECK(lnm_http_route_match_get(&segment, &match, "hello") == lnm_err_ok);
TEST_CHECK(segment->start == 6);
TEST_CHECK(segment->len == 8);
} }
TEST_LIST = { TEST_LIST = {