'Move struct into a separate file without splitting into a separate module?

I have this file hierarchy:

main.rs
protocol/
protocol/mod.rs
protocol/struct.rs

In struct.rs:

pub struct Struct {
    members: i8
}

impl Struct {
    pub fn new() -> Struct {
        Struct { 4 }
    }
}

How do I access it as:

mod protocol;
protocol::Struct::new();
// As opposed to:
// protocol::struct::Struct::new();

I've tried various combinations of pub use and mod but admittedly I'm poking at things blindly.

Is it possible to split a struct (and it's impl) into a separate file without having to create a new mod?



Solution 1:[1]

The short answer: use pub use Type in your mod.rs. A full example follows:

My structure:

src/
??? main.rs
??? protocol
?   ??? thing.rs
??? protocol.rs

main.rs

mod protocol;

fn main() {
    let a = protocol::Thing::new();
    println!("Hello, {:?}", a);
}

protocol.rs

pub use self::thing::Thing;
mod thing;

protocol/thing.rs

#[derive(Debug)]
pub struct Thing(i8);

impl Thing {
    pub fn new() -> Thing { Thing(4) }
}

As a housekeeping bit, don't call files the same thing as language keywords. struct causes compilation problems, so I renamed it. Also, your struct creation syntax was incorrect, so I picked the shorter version for this example ^_^.

And to answer the question posed in your title: Without using esoteric features, a file always creates a new module — you can't put something into a different file without also putting it in a different module. You can re-export the type so it doesn't look like it though.

Further explanation: The mod keyword tells the compiler to look for a file by that name and reference it from the current file as a module. For example, mod protocol; will look for a file protocol.rs and behave as if it had included its contents, similar to:

mod protocol {
    // ... contents here
};

See Rust by Example for more details.

Solution 2:[2]

With mod.rs:

src/
??? main.rs
??? protocol
    ??? mod.rs
    ??? thing.rs

protocol/thing.rs

pub struct Struct {
    members: i8
}

impl Struct {
    pub fn new() -> Struct {
        Struct { members: 4 }
    }
}

protocol/mod.rs

pub mod thing;

main.rs

mod protocol;

fn main() {
    protocol::thing::Struct::new();
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2