structx

Crates.iostructx
lib.rsstructx
version0.1.11
sourcesrc
created_at2021-03-16 16:15:14.297161
updated_at2024-01-15 12:57:15.861942
descriptionSimulating anonymous struct and named arguments in Rust.
homepage
repositoryhttps://github.com/oooutlk/structx
max_upload_size
id369739
size21,712
(oooutlk)

documentation

https://docs.rs/structx

README

See RFC as Readme-For-Crate 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:

[dependencies]
structx = "0.1"

[build-dependencies]
inwelling = "0.5"

[package.metadata.inwelling]
structx = true

Add the following in your build.rs file:

inwelling::to( "structx" );

Add the following in your .rs files:

use structx::*;

If you want to use named arguments, add the following:

use structx::named_args::*;

Definitions and notations of anonymous structs

Anonymous structs are structs 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

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

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.

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.

#[named_args]
fn set_size( width: u32, height: u32 ) { todo!() }

At call site, wrap arguments with args!{}.

set_size( args!{ width: 1024, height: 768 });

License

Under Apache License 2.0 or MIT License, at your will.

Commit count: 26

cargo fmt