Rust Project Structure
Understanding standard Rust project organization and file architecture.
Intermediateā±ļø 40 minš Prerequisites: 2
Rust Project Structure
Proper project structure is essential for maintainable, scalable Rust applications.
Standard Rust Project Layout
my-project/
āāā Cargo.toml # Project manifest
āāā Cargo.lock # Dependency lock file
āāā README.md # Project documentation
āāā .gitignore # Git ignore rules
āāā src/ # Source code
ā āāā main.rs # Binary entry point
ā āāā lib.rs # Library entry point
ā āāā bin/ # Additional binaries
ā ā āāā cli.rs
ā āāā modules/ # Application modules
ā ā āāā mod.rs
ā ā āāā api.rs
ā ā āāā db.rs
ā āāā utils/ # Utility functions
ā āāā helpers.rs
āāā tests/ # Integration tests
ā āāā integration_test.rs
āāā examples/ # Example code
ā āāā basic_example.rs
āāā benches/ # Benchmark tests
ā āāā performance.rs
āāā docs/ # Additional documentation
Cargo.toml Structure
TOML[package] name = "my-project" version = "0.1.0" edition = "2021" authors = ["Your Name"] description = "Project description" license = "MIT" [dependencies] # External crates serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.0", features = ["full"] } [dev-dependencies] # Test dependencies mockito = "1.0" [build-dependencies] # Build-time dependencies [[bin]] name = "my-binary" path = "src/bin/my_binary.rs" [lib] name = "my_lib" path = "src/lib.rs"
Module Organization
Flat Structure (Small Projects)
src/
āāā main.rs
āāā api.rs
āāā database.rs
āāā models.rs
āāā utils.rs
Hierarchical Structure (Medium Projects)
src/
āāā main.rs
āāā lib.rs
āāā api/
ā āāā mod.rs
ā āāā routes.rs
ā āāā handlers.rs
āāā database/
ā āāā mod.rs
ā āāā connection.rs
ā āāā migrations.rs
āāā models/
āāā mod.rs
āāā user.rs
āāā transaction.rs
Domain-Driven Structure (Large Projects)
src/
āāā main.rs
āāā lib.rs
āāā domain/
ā āāā mod.rs
ā āāā user/
ā ā āāā mod.rs
ā ā āāā model.rs
ā ā āāā service.rs
ā āāā transaction/
ā āāā mod.rs
ā āāā model.rs
ā āāā service.rs
āāā infrastructure/
ā āāā mod.rs
ā āāā database.rs
ā āāā cache.rs
āāā api/
āāā mod.rs
āāā routes.rs
Workspace Structure (Multiple Crates)
workspace/
āāā Cargo.toml # Workspace manifest
āāā api/ # API crate
ā āāā Cargo.toml
ā āāā src/
āāā core/ # Core business logic
ā āāā Cargo.toml
ā āāā src/
āāā database/ # Database layer
ā āāā Cargo.toml
ā āāā src/
āāā shared/ # Shared utilities
āāā Cargo.toml
āāā src/
Workspace Cargo.toml:
TOML[workspace] members = ["api", "core", "database", "shared"] resolver = "2" [workspace.dependencies] # Shared dependencies serde = "1.0" tokio = "1.0"
Best Practices
- Separation of concerns: Keep business logic separate from infrastructure
- Module visibility: Use
pubcarefully, prefer private by default - Feature flags: Use Cargo features for optional functionality
- Tests alongside code: Unit tests in same file, integration tests in
tests/ - Documentation: Use
///for public API docs - Error types: Centralize error definitions
- Configuration: Separate config from code
Code Examples
Module Structure Example
Organizing code into modules
RUST
pub mod api;
pub mod database;
pub mod models;
pub mod routes;
pub mod handlers;
pub fn setup_routes() {
println!("Setting up API routes");
}
pub fn handle_request() {
println!("Handling request");
}
pub mod connection;
pub mod migrations;
pub mod user;
pub mod transaction;
fn main() {
println!("Project structure:");
println!("- lib.rs: Library entry point");
println!("- mod.rs: Module declarations");
println!("- Separate files: Different concerns");
}Explanation:
Modules organize code into logical units. Each module can be in its own file or directory with a mod.rs file.
Workspace Structure
Multi-crate workspace organization
RUST
fn main() {
println!("Workspace benefits:");
println!("- Multiple related crates");
println!("- Shared dependencies");
println!("- Independent versioning");
println!("- Faster compilation");
}Explanation:
Workspaces allow managing multiple related crates together. They share a dependency resolver and can reference each other.
Exercises
Create Module Structure
Create a module structure with api, database, and models modules!
Starter Code:
RUST
fn main() {
println!("Modules created!");
}