diff --git a/Cargo.lock b/Cargo.lock index 32e72f368d9448c54d2d66570654ad2656964259..4aed173ce8a1261e2bd46752cb6859d63ac98b0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1302,7 +1302,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "script" -version = "0.2.2" +version = "0.2.3" dependencies = [ "actix-web", "fancy-regex", diff --git a/Cargo.toml b/Cargo.toml index 3370512509a0dc2acaf3f4fdd4b50158f2143743..547fe23e5194da64497ef4dd78436238026dbcf7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "script" -version = "0.2.2" +version = "0.2.3" edition = "2021" license = "MIT" repository = "https://lab.themackabu.dev/self/script" diff --git a/Maidfile.toml b/Maidfile.toml index dc0c72307c4d50582f5b441307130742d7705ec8..8a02deb9b7609a0abf8b64af9a4ef7965fdb3c24 100644 --- a/Maidfile.toml +++ b/Maidfile.toml @@ -1,6 +1,6 @@ [project] name = "script" -version = "0.2.2" +version = "0.2.3" [tasks] clean = { script = ["rm -rf bin", "mkdir bin"] } diff --git a/app.routes b/app.routes index 5719f4b1396c1fdcddbf7928ab4734096c243499..f5d3cfdfb824c0a12eb34cc4fa2a9c4e30d1a107 100644 --- a/app.routes +++ b/app.routes @@ -11,12 +11,12 @@ example() { html(http::get("https://example.org").body) } -#[route("/example/{id}")] +#[route("/example/{id}.txt")] example(id) { text("base: " + id) } -#[route("/example/{id}/test.json")] +#[route("/example/{id}/test")] example_test(id) { text("sub: " + id) } @@ -75,5 +75,5 @@ test/loadfile() { } 404 { - text("404 page\n\n") + text("404 page") } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 9c71d1be55bfb9b3bbe0f127d07528cfb792e4c5..110c7b7f220403ad454c5b3169e216a4a1cad125 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,13 +72,14 @@ fn match_route(route_template: &str, placeholders: &[&str], url: &str) -> Option for (route_segment, url_segment) in route_segments.iter().zip(url_segments.iter()) { if let Some(placeholder_value) = match_segment(route_segment, url_segment, placeholders) { - matched_placeholders.push(placeholder_value); + if !placeholder_value.is_empty() { + matched_placeholders.push(placeholder_value); + } } else { return None; } } - matched_placeholders.retain(|x| x != ""); Some(matched_placeholders) } @@ -93,7 +94,13 @@ fn match_segment(route_segment: &str, url_segment: &str, placeholders: &[&str]) } else if route_segment == url_segment { Some("".to_string()) } else { - None + let route_parts: Vec<&str> = route_segment.split('.').collect(); + let url_parts: Vec<&str> = url_segment.split('.').collect(); + if route_parts.len() == url_parts.len() && route_parts.last() == url_parts.last() { + match_segment(route_parts[0], url_parts[0], placeholders) + } else { + None + } } } @@ -427,6 +434,8 @@ async fn handler(url: Path, req: HttpRequest) -> impl Responder { } }; + let status_code = ternary!(has_wildcard, status_code, StatusCode::NOT_FOUND); + println!("{}: {} (status={}, type={})", req.method(), req.uri(), status_code, content_type); return HttpResponse::build(status_code).content_type(content_type).body(body); }