--- name: tokio-scaffold description: Scaffold new Tokio projects with proper structure and best practices --- # Tokio Scaffold Command This command scaffolds new Tokio-based Rust projects with modern structure, proper dependencies, error handling patterns, tracing infrastructure, and testing setup. ## Arguments - `$1` - Project name (required) - `$2` - Project type: `http-server`, `grpc-server`, `tcp-server`, `cli`, or `library` (optional, defaults to `library`) ## Usage ``` /rust-tokio-expert:tokio-scaffold my-service http-server /rust-tokio-expert:tokio-scaffold my-cli cli /rust-tokio-expert:tokio-scaffold my-lib library ``` ## Workflow 1. **Validate Arguments** - Check that project name is provided - Validate project type if provided - Ensure target directory doesn't already exist 2. **Invoke Agent** - Use Task tool with `subagent_type="rust-tokio-expert:tokio-pro"` - Pass project name and type to the agent 3. **Agent Instructions** The agent should create a complete project structure based on the type: ### For HTTP Server Projects Create: - `Cargo.toml` with dependencies: - tokio with full features - axum for HTTP framework - tower and tower-http for middleware - serde and serde_json for serialization - tracing and tracing-subscriber for logging - anyhow and thiserror for error handling - sqlx (optional) for database - config for configuration management - `src/main.rs` with: - Runtime setup with tracing - Router configuration - Graceful shutdown handling - Health check endpoints - `src/handlers/mod.rs` with example HTTP handlers - `src/error.rs` with custom error types - `src/config.rs` with configuration loading - `src/telemetry.rs` with tracing setup - `tests/integration_test.rs` with API integration tests - `.env.example` with configuration template - `README.md` with usage instructions ### For gRPC Server Projects Create: - `Cargo.toml` with: - tokio with full features - tonic and tonic-build - prost for protobuf - tower for middleware - tracing infrastructure - error handling crates - `proto/service.proto` with example service definition - `build.rs` for proto compilation - `src/main.rs` with gRPC server setup - `src/service.rs` with service implementation - `src/error.rs` with error types - `tests/integration_test.rs` ### For TCP Server Projects Create: - `Cargo.toml` with: - tokio with io-util, net features - tokio-util with codec - bytes for buffer management - tracing infrastructure - `src/main.rs` with TCP server setup - `src/protocol.rs` with protocol definition - `src/handler.rs` with connection handler - `tests/integration_test.rs` ### For CLI Projects Create: - `Cargo.toml` with: - tokio with full features - clap for argument parsing - anyhow for error handling - tracing-subscriber for logging - `src/main.rs` with CLI setup - `src/commands/mod.rs` with command structure - `src/config.rs` with configuration - `tests/cli_test.rs` ### For Library Projects Create: - `Cargo.toml` with: - tokio as optional dependency - async-trait - thiserror for errors - `src/lib.rs` with library structure - `tests/lib_test.rs` with comprehensive tests - `examples/basic.rs` with usage example - `README.md` with API documentation 4. **Common Files for All Types** - `.gitignore` with Rust-specific ignores - `Cargo.toml` with proper metadata - `rustfmt.toml` with formatting rules - `clippy.toml` with linting configuration (if needed) 5. **Initialize Testing** For all project types: - Add `#[tokio::test]` examples - Include timeout tests - Add mock/test utilities - Set up test helpers 6. **Documentation** Generate `README.md` with: - Project description - Requirements - Installation instructions - Usage examples - Development setup - Testing instructions - Contributing guidelines 7. **Verification** After scaffolding: - Run `cargo check` to verify compilation - Run `cargo test` to verify tests - Report any issues found ## Example Cargo.toml Template (HTTP Server) ```toml [package] name = "{{project_name}}" version = "0.1.0" edition = "2021" [dependencies] tokio = { version = "1", features = ["full"] } axum = "0.7" tower = "0.4" tower-http = { version = "0.5", features = ["trace", "compression-gzip"] } serde = { version = "1", features = ["derive"] } serde_json = "1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } anyhow = "1" thiserror = "1" config = "0.14" [dev-dependencies] tokio-test = "0.4" ``` ## Example Main Template (HTTP Server) ```rust use axum::{Router, routing::get}; use std::net::SocketAddr; use tower_http::trace::TraceLayer; mod handlers; mod error; mod config; mod telemetry; #[tokio::main] async fn main() -> anyhow::Result<()> { // Initialize telemetry telemetry::init()?; // Load configuration let config = config::load()?; // Create router let app = Router::new() .route("/health", get(handlers::health_check)) .route("/api/v1/users", get(handlers::list_users)) .layer(TraceLayer::new_for_http()); // Start server let addr = SocketAddr::from(([0, 0, 0, 0], config.port)); tracing::info!("Starting server on {}", addr); let listener = tokio::net::TcpListener::bind(addr).await?; axum::serve(listener, app) .with_graceful_shutdown(shutdown_signal()) .await?; Ok(()) } async fn shutdown_signal() { tokio::signal::ctrl_c() .await .expect("failed to install CTRL+C signal handler"); } ``` ## Best Practices The scaffolded project should follow these best practices: 1. **Error Handling**: Use `thiserror` for domain errors, `anyhow` for application errors 2. **Configuration**: Use environment variables with sensible defaults 3. **Logging**: Use `tracing` with structured logging 4. **Testing**: Include both unit and integration tests 5. **Documentation**: Generate comprehensive README with examples 6. **Security**: Include basic security headers and validation 7. **Performance**: Configure runtime appropriately for workload type 8. **Observability**: Include metrics and health check endpoints ## Notes - Always use the latest stable versions of dependencies - Include comments explaining key architectural decisions - Provide both simple and advanced usage examples - Generate projects that compile and pass tests out of the box - Follow Rust API guidelines and naming conventions