feat(routing): add api to access key segments by name
parent
f652fa08c1
commit
9dbdb0b089
|
@ -8,13 +8,15 @@
|
|||
|
||||
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 {
|
||||
const lnm_http_route *route;
|
||||
lnm_http_method method;
|
||||
struct {
|
||||
size_t start;
|
||||
size_t len;
|
||||
} key_segments[LNM_HTTP_MAX_KEY_SEGMENTS];
|
||||
lnm_http_route_match_segment key_segments[LNM_HTTP_MAX_KEY_SEGMENTS];
|
||||
} lnm_http_route_match;
|
||||
|
||||
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,
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,15 @@ void test_routing_simple() {
|
|||
TEST_CHECK(match.key_segments[0].len == 8);
|
||||
TEST_CHECK(match.key_segments[1].start == 15);
|
||||
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 = {
|
||||
|
|
Loading…
Reference in New Issue