# Shadow Clone
A macro to clone variables into the current scope shadowing old ones.

[![pipeline status](https://gitlab.com/efunb/shadow-clone/badges/stable/pipeline.svg)](https://gitlab.com/efunb/shadow-clone/commits/stable)
[![Latest version](https://img.shields.io/crates/v/shadow-clone.svg)](https://crates.io/crates/shadow-clone)
[![Latest Docs](https://docs.rs/shadow-clone/badge.svg)](https://docs.rs/shadow-clone)
[![License](https://img.shields.io/crates/l/shadow-clone.svg)](https://crates.io/crates/shadow-clone)
[![downloads-badge](https://img.shields.io/crates/d/shadow-clone.svg)](https://crates.io/crates/shadow-clone)

## Help

If you run into any issues or need help with using `shadow-clone` in your project please email [incoming+efunb-shadow-clone-12722979-issue-@incoming.gitlab.com](mailto:incoming+efunb-shadow-clone-12722979-issue-@incoming.gitlab.com).

## How to use

Add 
```toml
shadow-clone = "1"
```
to your `cargo.toml` under `[dependencies]` and add
```rust
use shadow_clone::shadow_clone;
```
to your main file.

## Examples
```rust
let s = "foo".to_string();
let c = move |x: i32| format!("{}{}", s, x);
let bar = s;
```
This will not compile as `s` has been moved into the closure.

This issue can be solved with this macro.
```rust
use shadow_clone::shadow_clone;
let s = "foo".to_string();
{
    shadow_clone!(s);
    let c = move |x: i32| format!("{}{}", s, x);
}
let bar = s;
```
That expands to,
```rust
use shadow_clone::shadow_clone;
let s = "foo".to_string();
{
    let s = s.clone();
    let c = move |x: i32| format!("{}{}", s, x);
}
let bar = s;
```
You can also clone multiple variables separated by commas: `shadow_clone!(foo, bar);`.

You can also bind a clone as mutable by prefixing with `mut`: `shadow_clone!(mut foo);`.

## Docs

[API Documentation](https://docs.rs/shadow-clone)

## **Warning**

**If you are viewing this from GitHub then this is a read only copy. Please contribute to the GitLab copy [here](https://gitlab.com/efunb/shadow-clone).**