# radixtree A radix tree implementation for router, and provides CRUD operations. Radixtree is part of [treemux](https://github.com/casualjim/rs-treemux/), on top of which updates and removes are added. ## Usage Add this to your `Cargo.toml`: ``` radixtree = "0.1.0" ``` ### Insert ```rust use radixtree::{Node, Method}; fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/", "GET"); tree.insert(Method::POST, "/", "POST"); tree.insert(Method::PUT, "/", "PUT"); tree.insert(Method::DELETE, "/", "DELETE"); let result = tree.search(Method::GET, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"GET"); let result = tree.search(Method::POST, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"POST"); let result = tree.search(Method::PUT, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"PUT"); let result = tree.search(Method::DELETE, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"DELETE"); } ``` ### Update ```rust use radixtree::{Node, Method}; fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/", "GET"); tree.insert(Method::POST, "/", "POST"); tree.insert(Method::PUT, "/", "PUT"); tree.insert(Method::DELETE, "/", "DELETE"); tree.update(Method::GET, "/", "UPDATE GET"); tree.update(Method::POST, "/", "UPDATE POST"); tree.update(Method::PUT, "/", "UPDATE PUT"); tree.update(Method::DELETE, "/", "UPDATE DELETE"); let result = tree.search(Method::GET, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE GET"); let result = tree.search(Method::POST, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE POST"); let result = tree.search(Method::PUT, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE PUT"); let result = tree.search(Method::DELETE, "/"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE DELETE"); } ``` ### Remove ```rust use radixtree::{Node, Method}; fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/", "GET"); tree.insert(Method::POST, "/", "POST"); tree.insert(Method::PUT, "/", "PUT"); tree.insert(Method::DELETE, "/", "DELETE"); tree.remove("/"); let result = tree.search(Method::GET, "/"); assert!(result.is_none()); let result = tree.search(Method::POST, "/"); assert!(result.is_none()); let result = tree.search(Method::PUT, "/"); assert!(result.is_none()); let result = tree.search(Method::DELETE, "/"); assert!(result.is_none()); } ``` ### Parameter Paths ```rust use radixtree::{Node, Method}; fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/user/$id", "GET"); let result = tree.search(Method::GET, "/user/1"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"GET"); tree.update(Method::GET, "/user/$id", "UPDATE GET"); let result = tree.search(Method::GET, "/user/1"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE GET"); tree.remove("/user/$id"); let result = tree.search(Method::GET, "/user/1"); assert!(result.is_none()); } ``` ### Wildcard Star ```rust use radixtree::{Node, Method}; fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/image/*", "GET"); let result = tree.search(Method::GET, "/image/hello.jpeg"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"GET"); let result = tree.search(Method::GET, "/image/jpg/hello.jpg"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"GET"); let result = tree.search(Method::GET, "/image/png/hello.png"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"GET"); tree.update(Method::GET, "/image/*", "UPDATE GET"); let result = tree.search(Method::GET, "/image/hello.jpeg"); assert!(result.is_some()); assert_eq!(result.unwrap().value(), &"UPDATE GET"); tree.remove("/image/*"); let result = tree.search(Method::GET, "/image/hello.jpeg"); assert!(result.is_none()); } ``` ### Match Rules Some examples of valid URL paths are: - /abc/def - /favicon.ico - /user/$id - /id/$id/name/$name - /$year/$month - /$year/$month/$day - /images/* - /images/$category/* Note that all of the above URL paths may exist in the radix tree at the same time. Paths starting with `$` indicate parameter paths. Parameter paths only match a single path segment. That is, the path `/user/$id` will match on `/user/1` or `/user/2`, but not `/user/1/2`. Wildcard `*` can match any path. For example, the path `/image/*` will match on `/image/png/hello.png`, `/image/jpg/hello.jpg` or `image/hello.jpeg`. ### Match Priority 1. Static paths take the highest priority. 2. Parameter paths take second priority. 3. Finally, the wildcard `*` matches paths where static paths and parameter paths do not match. ## Author Zhenwei Guo (Ilqjx) ## License This project is licensed under the [MIT license](https://github.com/Ilqjx/radixtree/blob/master/LICENSE).