#builder-pattern #fundamental #general-purpose

no-std mod_interface

Protocol of modularity unifying interface of a module and introducing layers

34 releases (20 breaking)

0.22.0 Jun 29, 2024
0.20.0 May 30, 2024
0.17.0 Mar 26, 2024
0.6.0 Nov 4, 2023
0.1.16 Jul 19, 2022

#546 in Development tools

Download history 4366/week @ 2024-03-13 3174/week @ 2024-03-20 638/week @ 2024-03-27 816/week @ 2024-04-03 510/week @ 2024-04-10 369/week @ 2024-04-17 621/week @ 2024-04-24 820/week @ 2024-05-01 4328/week @ 2024-05-08 2197/week @ 2024-05-15 1536/week @ 2024-05-22 4364/week @ 2024-05-29 1597/week @ 2024-06-05 679/week @ 2024-06-12 406/week @ 2024-06-19 801/week @ 2024-06-26

3,888 downloads per month
Used in 90 crates (9 directly)

MIT license

23KB
159 lines

Module :: mod_interface

experimental rust-status docs.rs discord

Protocol of modularity unifying interface of a module and introducing layers.

Basic use-case

Library file with code inner.rs:

pub( crate ) mod private
{
  /// Routine of inner module.
  pub fn inner_is() -> bool
  {
    true
  }
}

//

mod_interface::mod_interface!
{
  prelude use inner_is;
}

Main file that generates modules and namespaces main.rs :

use mod_interface::mod_interface;

//

fn main()
{
  assert_eq!( prelude::inner_is(), inner::prelude::inner_is() );
}

//

mod_interface::mod_interface!
{
  /// Inner.
  layer inner;
}

It generates code :

use mod_interface::mod_interface;

//

fn main()
{
  assert_eq!( prelude::inner_is(), inner::prelude::inner_is() );
}

//

/// Inner.
pub mod inner
{
  pub( crate ) mod private
  {
    /// Routine of inner module.
    pub fn inner_is() -> bool { true }
  }

  /// Protected namespace of the module.
  pub mod protected
  {
    pub use super::orphan::*;
  }
  pub use protected::*;

  /// Orphan namespace of the module.
  pub mod orphan
  {
    pub use super::exposed::*;
  }

  /// Exposed namespace of the module.
  pub mod exposed
  {
    pub use super::prelude::*;
  }

  /// Prelude to use essentials: `use my_module::prelude::*`.
  pub mod prelude
  {
    pub use super::private::inner_is;
  }
}

/// Protected namespace of the module.
pub mod protected
{
  pub use super::orphan::*;
  pub use super::inner::orphan::*;
}
pub use protected::*;

/// Orphan namespace of the module.
pub mod orphan
{
  pub use super::exposed::*;
}

/// Exposed namespace of the module.
#[ allow( unused_imports ) ]
pub mod exposed
{
  use super::*;
  pub use super::prelude::*;
  pub use super::inner::exposed::*;
}

/// Prelude to use essentials: `use my_module::prelude::*`.
pub mod prelude
{
  pub use super::inner::prelude::*;
}

Debugging

To debug module interface use directive #![ debug ] in macro mod_interface. Let's update the main file of the example :

mod_interface::mod_interface!
{
  #![ debug ]
  /// Inner.
  layer inner;
}

Full sample see at sample directory.

To add to your project

cargo add mod_interface

Try out from the repository

git clone https://github.com/Wandalen/wTools
cd wTools
cd examples/mod_interface_trivial
cargo run

Try out from the repository

git clone https://github.com/Wandalen/wTools
cd wTools
cd examples/mod_interface_trivial
cargo run

Dependencies

~3MB
~51K SLoC