[pitboss/grind] deferred session-0014 (20260520T233019Z-6958)

This commit is contained in:
pitboss 2026-05-21 08:33:26 -05:00
parent d4fdd83578
commit ba0f83a855
2 changed files with 201 additions and 3 deletions

View file

@ -19,8 +19,8 @@ use crate::symbol::Lang;
use tree_sitter::Node;
use super::rust_routes::{
bind_rust_path_params, find_method_attribute, find_rust_function, rust_formal_names,
source_imports_actix,
bind_rust_path_params, find_actix_route_chain, find_method_attribute, find_rust_function,
rust_formal_names, source_imports_actix,
};
pub struct RustActixAdapter;
@ -46,7 +46,8 @@ impl FrameworkAdapter for RustActixAdapter {
return None;
}
let func = find_rust_function(ast, file_bytes, &summary.name)?;
let (method, path) = find_method_attribute(func, file_bytes)?;
let (method, path) = find_method_attribute(func, file_bytes)
.or_else(|| find_actix_route_chain(ast, file_bytes, &summary.name))?;
let formals = rust_formal_names(func, file_bytes);
let request_params = bind_rust_path_params(&formals, &path);
Some(FrameworkBinding {
@ -126,4 +127,51 @@ mod tests {
.detect(&summary("helper"), tree.root_node(), src)
.is_none());
}
#[test]
fn fires_on_app_new_route_chain() {
let src: &[u8] = b"use actix_web::{App, web};\n\
fn build() -> App<()> { App::new().route(\"/u/{id}\", web::get().to(show)) }\n\
async fn show(id: String) -> String { id }\n";
let tree = parse(src);
let binding = RustActixAdapter
.detect(&summary("show"), tree.root_node(), src)
.expect("binding");
assert_eq!(binding.adapter, "rust-actix");
let route = binding.route.expect("route");
assert_eq!(route.method, HttpMethod::GET);
assert_eq!(route.path, "/u/{id}");
let id = binding
.request_params
.iter()
.find(|p| p.name == "id")
.unwrap();
assert!(matches!(id.source, ParamSource::PathSegment(_)));
}
#[test]
fn fires_on_web_resource_route_chain() {
let src: &[u8] = b"use actix_web::{App, web};\n\
fn build() -> App<()> { App::new().service(web::resource(\"/save\").route(web::post().to(save))) }\n\
async fn save(body: String) -> String { body }\n";
let tree = parse(src);
let binding = RustActixAdapter
.detect(&summary("save"), tree.root_node(), src)
.expect("binding");
let route = binding.route.expect("route");
assert_eq!(route.method, HttpMethod::POST);
assert_eq!(route.path, "/save");
}
#[test]
fn chained_builder_requires_handler_match() {
let src: &[u8] = b"use actix_web::{App, web};\n\
fn build() -> App<()> { App::new().route(\"/x\", web::get().to(other)) }\n\
async fn show() -> String { String::new() }\n\
async fn other() -> String { String::new() }\n";
let tree = parse(src);
assert!(RustActixAdapter
.detect(&summary("show"), tree.root_node(), src)
.is_none());
}
}