main

Attribute Macro main 

Source
#[main]
Expand description

An attribute that can be attached to your main function which initializes magic statics in the specified order.

Does nothing to a magic static if it has already been initialized.

§Safety

The following behaviour is considered undefined:

  • Initializing magic statics from multiple threads concurrently.
  • Spawning new threads and accessing magic statics during initialization from them.
  • Interior mutability of magic statics where the mutability is not synchronized across multiple threads (e.g. with a Mutex or RwLock.) This is not a problem for single-threaded applications.

§Example

mod foo {
    magic_static! {
        pub(super) static ref MAGIC: usize = {
            println!("Magic!");
            42
        };

        pub(super) static ref BAR: std::sync::Mutex::<()> = std::sync::Mutex::new(());
    }
}

// You can also modularize your magic statics like so:
mod baz {
    magic_static! {
        pub(super) static ref MAGIC: usize = {
            println!("Magic!");
            42
        };

        pub(super) static ref BAR: std::sync::Mutex<()> = std::sync::Mutex::new(());
    }

    #[magic_static::main(
        MAGIC,
        BAR
    )]
    // The `magic_statics!` macro (NOT `magic_static!`) can generate this function for you
    pub fn magic_static() {}
}

#[magic_static::main(
    foo::MAGIC,
    foo::BAR,
    mod baz // This will initialize all magic statics in `baz`
)]
fn main() {
    println!("Hello, world!");
}