[![crates.io](https://img.shields.io/crates/v/chainer.svg)](https://crates.io/crates/chainer) [![docs.rs](https://docs.rs/chainer/badge.svg)](https://docs.rs/chainer/) [![license](https://img.shields.io/crates/l/chainer)](https://github.com/WilliamVenner/chainer/blob/master/LICENSE) # chainer A cursed crate that allows for global call chaining with access to chained function results **Currently the `results` feature requires the `min_specialization` Rust Nightly feature.** # Usage ```toml [dependencies] chainer = "*" # or, with a nightly compiler [dependencies] chainer = { version = "*", features = ["results"] } ``` # Examples ## Basic usage (default) ### Immutable call chaining ```rust use chainer::*; struct HelloWorld; impl HelloWorld { fn print(&self) { println!("Hello, world!"); } } fn main() { HelloWorld .chain(HelloWorld::print) .chain(HelloWorld::print) .chain(HelloWorld::print); // Hello, world! // Hello, world! // Hello, world! } ``` ### Mutable call chaining ```rust use chainer::*; struct Counter { value: i32 } impl Counter { fn increment(&mut self) { self.value += 1; println!("{}", self.value); } } fn main() { Counter { value: 0 } .chain_mut(Counter::increment) .chain_mut(Counter::increment) .chain_mut(Counter::increment); // 1 // 2 // 3 } ``` ## `features = ["results"]` ### Immutable call chaining ```rust use chainer::*; struct HelloWorld; impl HelloWorld { fn print(&self) -> &'static str { println!("Hello, world!"); "It works!" } } fn main() { let value: &'static str = HelloWorld .chain(HelloWorld::print) .chain(HelloWorld::print) .chain(HelloWorld::print) .result; // Hello, world! // Hello, world! // Hello, world! // It works! } ``` ### Mutable call chaining ```rust use chainer::*; struct Counter { value: i32 } impl Counter { fn increment(&mut self) -> i32 { self.value += 1; println!("{}", self.value); self.value } } fn main() { let value: i32 = Counter { value: 0 } .chain_mut(Counter::increment) .chain_mut(Counter::increment) .chain_mut(Counter::increment) .result; println!("{value}"); // 1 // 2 // 3 // 3 } ```