--- adapter: language: rust display_name: "Rust" version: "1.0" detection: files: [Cargo.toml, Cargo.lock] content_patterns: - file: "Cargo.toml" pattern: '\\[package\\]' confidence: 0.95 commands: build: "cargo build" test: "cargo test" lint: "cargo clippy -- -D warnings" lint_arch: null # Rust module system enforces architecture naturally format: "cargo fmt" start: "cargo run" dev: "cargo watch -x run" package_manager: detection: [] # Cargo is built-in default: "cargo" install_command: "cargo build" route_detection: server_indicators: - pattern: 'use actix_web|actix_web::' description: "Actix-web framework" frameworks: ["actix-web"] - pattern: 'use axum|axum::' description: "Axum web framework" frameworks: ["axum"] - pattern: 'use rocket|#\[rocket::main\]' description: "Rocket web framework" frameworks: ["rocket"] - pattern: 'use warp|warp::' description: "Warp web framework" frameworks: ["warp"] - pattern: 'use hyper|hyper::' description: "Hyper HTTP library" frameworks: ["hyper"] - pattern: 'use tide|tide::' description: "Tide web framework" frameworks: ["tide"] cli_indicators: - pattern: 'use clap|clap::' description: "Clap CLI framework" frameworks: ["clap"] - pattern: 'use structopt|structopt::' description: "StructOpt CLI (legacy clap)" frameworks: ["structopt"] - pattern: 'std::env::args' description: "Standard library args parsing" frameworks: ["stdlib"] frontend_indicators: - pattern: 'use leptos|leptos::' description: "Leptos WASM framework" frameworks: ["leptos"] - pattern: 'use yew|yew::' description: "Yew WASM framework" frameworks: ["yew"] - pattern: 'use dioxus|dioxus::' description: "Dioxus UI framework" frameworks: ["dioxus"] patterns: # Actix-web - type: route regex: '#\[(?:web::)?(get|post|put|delete|patch)\s*\(\s*"([^"]+)"' groups: [method, path] frameworks: ["actix-web"] # Axum - type: route regex: '\.(get|post|put|delete|patch)\s*\(\s*"([^"]+)"' groups: [method, path] frameworks: ["axum"] # Rocket - type: route regex: '#\[(get|post|put|delete|patch)\s*\(\s*"([^"]+)"' groups: [method, path] frameworks: ["rocket"] # Clap derive - type: command regex: '#\[command\s*\(.*name\s*=\s*"([^"]+)"' groups: [command_name] frameworks: ["clap"] # Clap builder - type: command regex: 'Command::new\s*\(\s*"([^"]+)"' groups: [command_name] frameworks: ["clap"] import_analysis: list_packages: "cargo metadata --format-version 1" import_pattern: "use\\s+([\\w:]+)" source_extensions: [".rs"] module_root_file: "Cargo.toml" layer_conventions: patterns: - layer: 0 paths: ["src/models", "src/types", "src/domain"] description: "Domain types and models" - layer: 1 paths: ["src/utils", "src/common", "src/lib.rs"] description: "Shared utilities" - layer: 2 paths: ["src/services", "src/core", "src/repository"] description: "Business logic" - layer: 3 paths: ["src/handlers", "src/routes", "src/api"] description: "HTTP/API handlers" - layer: 4 paths: ["src/main.rs", "src/bin"] description: "Entry points" dependency_detection: manifest_file: "Cargo.toml" databases: - pattern: 'sqlx.*postgres|tokio-postgres|diesel.*postgres' type: "postgres" default_port: 5432 - pattern: 'sqlx.*mysql|diesel.*mysql' type: "mysql" default_port: 3306 - pattern: 'mongodb' type: "mongodb" default_port: 27017 - pattern: 'redis|deadpool-redis' type: "redis" default_port: 6379 - pattern: 'rusqlite|sqlx.*sqlite' type: "sqlite" default_port: 0 services: - pattern: 'rdkafka|kafka' type: "kafka" default_port: 9092 - pattern: 'lapin|amqp' type: "rabbitmq" default_port: 5672 - pattern: 'elasticsearch' type: "elasticsearch" default_port: 9200 env_var_patterns: - pattern: 'std::env::var\(\s*"([^"]+)"' - pattern: 'env::var\(\s*"([^"]+)"' - pattern: 'dotenv::var\(\s*"([^"]+)"' linter: template_section: "rust-linter" script_extension: ".rs" run_command: "cargo clippy" naming: file_pattern: "^[a-z][a-z0-9_]*\\.rs$" test_pattern: "^[a-z][a-z0-9_]*\\.rs$" # Tests are inline in Rust directory_style: "snake_case" ci: github_actions: image: null setup_steps: - "uses: dtolnay/rust-toolchain@stable\n with:\n components: clippy, rustfmt" cache_paths: ["~/.cargo/registry", "~/.cargo/git", "target"] --- # Rust Adapter ## Architecture Note Rust's module system (`mod`, `pub`, `pub(crate)`) naturally enforces encapsulation. The `lint_arch` command is `null` because Rust's compiler already prevents many dependency violations at compile time. However, a custom architectural linter can still be valuable for enforcing higher-level layer boundaries. ## Server Start Command Inference 1. Existing `harness/config/environment.json` startup command, if present 2. `Cargo.toml` has `[[bin]]` section → `cargo run --bin ` 3. Default → `cargo run` For release builds: `cargo build --release && ./target/release/` ## Framework-Specific Notes ### Axum - Router-based: `Router::new().route("/path", get(handler))` - Extractors for request parsing: `Json`, `Path`, `Query` - State sharing via `Extension` or `State` - Default: runs on `0.0.0.0:3000` ### Actix-web - Attribute macros: `#[get("/path")]`, `#[post("/path")]` - App factory pattern: `App::new().service(handler)` - Default: `HttpServer::new(...).bind("127.0.0.1:8080")` ### Rocket - Attribute macros: `#[get("/path")]`, `#[post("/path")]` - Fairings for middleware - Config via `Rocket.toml` ## Testing Patterns - Unit tests: inline `#[cfg(test)] mod tests { ... }` in same file - Integration tests: `tests/` directory at crate root - `cargo test` runs both - Useful flags: `cargo test -- --nocapture` (show println output) ## Workspace Support If `[workspace]` in root `Cargo.toml`: - Each member crate may have its own layer conventions - Build: `cargo build --workspace` - Test: `cargo test --workspace`