1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
/*! # Usage `src/Cargo.toml` ```toml [dependencies] app_route = "0.1" serde = { version = "1.0", features = ["derive"] } ``` `main.rs` ```rust use app_route::AppRoute; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, PartialEq)] struct UserListQuery { limit: Option<u64>, offset: Option<u64>, keyword: Option<String>, #[serde(default)] friends_only: bool, } #[derive(AppRoute, Debug, PartialEq)] #[route("/groups/:group_id/users")] struct UsersListRoute { group_id: u64, #[query] query: UserListQuery, } fn main() { let path: UsersListRoute = "/groups/4313145/users?offset=10&limit=20&friends_only=false&keyword=some_keyword" .parse() .unwrap(); assert_eq!( path, UsersListRoute { group_id: 4313145, query: { UserListQuery { limit: Some(20), offset: Some(10), keyword: Some("some_keyword".to_string()), friends_only: false, } } } ); println!("Path: {}", path); // Output: // Path: /groups/4313145/users?limit=20&offset=10&keyword=some_keyword&friends_only=false } ``` */ #[doc(hidden)] pub use lazy_static::lazy_static; #[doc(hidden)] pub use regex::Regex; #[doc(hidden)] pub use serde_qs; pub use app_route_derive::AppRoute; #[derive(Debug)] pub enum RouteParseErr { NoMatches, NoQueryString, ParamParseErr(String), QueryParseErr(String), } impl std::fmt::Display for RouteParseErr { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "{:?}", self) } } pub trait AppRoute: std::fmt::Display + std::str::FromStr { fn path_pattern() -> String where Self: Sized; fn query_string(&self) -> Option<String>; }