DEV Community

Subesh Yadav
Subesh Yadav

Posted on

πŸ¦€ Day 9 of #100DaysOfRust β€” Managing Growing Projects in Rust 🧱

As Rust projects grow in complexity, organizing code becomes essential. Today, I dived deep into Rust's powerful module systemβ€”how packages, crates, and modules help structure code for better readability, maintainability, and reuse.

πŸ“¦ Packages & Crates

βœ… Crate:

A crate is the smallest unit of compilation in Rust. It can be:

  • A binary crate: builds to an executable (main.rs)
  • A library crate: provides reusable logic (lib.rs)
# Create a new binary crate
cargo new my_project
Enter fullscreen mode Exit fullscreen mode

βœ… Package:

A package is a bundle of one or more crates.

  • Contains a Cargo.toml file.
  • Can have multiple binary crates, one library crate.

🧠 Key Point: By convention:

  • src/main.rs β†’ binary crate
  • src/lib.rs β†’ library crate

Want multiple binaries? Add them in src/bin/.

πŸ“‚ Modules and File Structure

Modules help you logically group related code and control visibility.

mod garden; // This tells Rust to look for src/garden.rs or src/garden/mod.rs
Enter fullscreen mode Exit fullscreen mode

In garden.rs, you can further define submodules:

pub mod vegetables;
Enter fullscreen mode Exit fullscreen mode

And in vegetables.rs:

#[derive(Debug)]
pub struct Asparagus {}
Enter fullscreen mode Exit fullscreen mode

πŸ” Module Tree Example:

crate
└── garden
    └── vegetables
        └── Asparagus
Enter fullscreen mode Exit fullscreen mode

πŸ” Privacy: Public vs Private

By default, items inside a module are private. Use pub to make them public.

pub mod garden {
    pub mod vegetables {
        #[derive(Debug)]
        pub struct Asparagus {}
    }
}
Enter fullscreen mode Exit fullscreen mode

To access:

use crate::garden::vegetables::Asparagus;

fn main() {
    let veggie = Asparagus {};
    println!("{:?}", veggie);
}
Enter fullscreen mode Exit fullscreen mode

🧭 Paths in Modules

Absolute Path:

crate::garden::vegetables::Asparagus
Enter fullscreen mode Exit fullscreen mode

Relative Path:

super::vegetables::Asparagus
Enter fullscreen mode Exit fullscreen mode

Use use to simplify:

use crate::garden::vegetables::Asparagus;
Enter fullscreen mode Exit fullscreen mode

Then:

let veg = Asparagus {};
Enter fullscreen mode Exit fullscreen mode

πŸ§ͺ Module Cheat Sheet

  • Start with mod your_module; in the crate root.
  • Place module files in:
  • src/your_module.rs
  • src/your_module/mod.rs
  • Declare submodules in sub-files.
  • Use pub for visibility.
  • Simplify paths with use.

πŸ“ Real Example File Structure

backyard/
β”œβ”€β”€ Cargo.toml
└── src/
    β”œβ”€β”€ main.rs          # crate root (binary)
    β”œβ”€β”€ garden.rs        # contains `pub mod vegetables`
    └── garden/
        └── vegetables.rs
Enter fullscreen mode Exit fullscreen mode

And your code:

main.rs

use crate::garden::vegetables::Asparagus;

pub mod garden;

fn main() {
    let plant = Asparagus {};
    println!("I'm growing {:?}", plant);
}
Enter fullscreen mode Exit fullscreen mode

garden.rs

pub mod vegetables;
Enter fullscreen mode Exit fullscreen mode

vegetables.rs

#[derive(Debug)]
pub struct Asparagus;
Enter fullscreen mode Exit fullscreen mode

🧠 Summary

Today’s learning focused on organizing Rust projects for scale and clarity.

  • πŸ“¦ Packages group crates.
  • 🧱 Crates are the compilation units.
  • 🧭 Modules help logically separate features.
  • πŸ” Visibility is opt-in (pub).
  • 🧡 Paths and use streamline access to items.

Rust enforces structure and clarity by design. Mastering this early on helps you grow clean, robust codebases.

πŸ“Œ Tomorrow, I’ll dive deeper into visibility, pub use, and real-world structuring in Rust!

Let me know your thoughts or questions in the comments! πŸ‘‡

Top comments (0)