1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
//! See [RFC as Readme-For-Crate](https://github.com/oooutlk/structx/blob/main/README.md)
//! for more.
//!
//! # Overview
//!
//! This project provides simulation of anonymous struct and named arguments in
//! Rust, using proc macros `structx!{}`, `Structx!{}`, `#[named_args]` and
//! `args!{}`.
//!
//! ## Usage of this crate
//!
//! Add the following in your Cargo.toml file:
//!
//! ```toml
//! [dependencies]
//! structx = "0.1"
//!
//! [build-dependencies]
//! inwelling = "0.4"
//!
//! [package.metadata.inwelling]
//! structx = true
//! ```
//!
//! Add the following in your build.rs file:
//!
//! ```rust
//! inwelling::to( "structx" );
//! ```
//! Add the following in your .rs files:
//!
//! ```rust,no_run
//! use structx::*;
//! ```
//!
//! If you want to use named arguments, add the following:
//!
//! ```rust,no_run
//! use structx::named_args::*;
//! ```
//!
//! # Definitions and notations of anonymous structs
//!
//! Anonymous structs are `struct`s without the needs of providing struct names.
//! However, the field names are mandatory. Anonymous structs are of the same type
//! if and only if they are composed of the same set of field names. The order of
//! fields are irrelevant.
//!
//! ## Value of anonymous structs
//!
//! The notation of an anonymous struct's value is `structx!{}`.
//!
//! ## Examples of anonymous struct's values
//!
//! ```rust,no_run
//! let foo = structx!{ i: 3, b: true };
//! let bar = structx!{ x, y };
//! ```
//!
//! ## Type of anonymous structs
//!
//! The notation of an anonymous struct's type is `Structx!{}`.
//!
//! ## Examples of anonymous struct's types
//!
//! ```rust,no_run
//! fn foo( x: i32, y: i32 ) -> Structx!{ x: i32, y: i32 } {
//! structx!{ x, y: y+1 }
//! }
//! ```
//! ## Traits derived for anonymous structs
//!
//! Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash.
//!
//! ```rust
//! let a = structx!{ width : 800, height: 600 };
//! let b = structx!{ height: 600, width : 800 };
//! let c = structx!{ width : 1024, height: 768 };
//! assert_eq!( a, b );
//! assert_ne!( a, c );
//! ```
//!
//! # Simulation of named arguments
//!
//! At definition site, add attributes `#[named_args]` to functions.
//!
//! ```rust,no_run
//! #[named_args]
//! fn set_size( width: u32, height: u32 ) { todo!() }
//! ```
//!
//! At call site, wrap arguments with `args!{}`.
//!
//! ```rust,no_run
//! set_size( args!{ width: 1024, height: 768 });
//! ```
//!
//! # License
//!
//! Under Apache License 2.0 or MIT License, at your will.
pub use structx_derive::{
Structx,
structx,
};
/// Simulating named arguments.
/// `#[named_args]` is for functions with named arguments.
/// `arg!{}` is an alias for `structx!{}`.
pub mod named_args {
pub use structx_derive::{
named_args,
structx as args,
};
}
include!( concat!( env!( "OUT_DIR" ), "/bindings.rs" ));