smelter 0.0.1

Custom derive attribute that automatically derives builder methods
Documentation
# About
This is a rust library to derive "Builder" methods for arbitrary rust structs. It relies on the Macros-1.1 RFC and currently only works with the nightly rust build. 

# How to use
## Setup

```toml
[dependencies]
smelter = { git = "https://github.com/Ivan1931/smelter" }
```

Add the following to the file in which you with to use smelter.
```
#![feature(proc_macro, custom_attribute)]

#[macro_use]
extern crate smelter;
```

Then just add ```#[derive(Builder)]``` above your struct,

## Simple Example with Generated Code
<table border="0">
<tr>
<td>
Smelter
</td>
<td>
Generated Code
</td>
</tr>
<tr>
<td>
<pre lang="rust">
#![feature(proc_macro, custom_attribute)]

#[macro_use]
extern crate smelter;

#[derive(PartialEq, Debug, Builder, Default)]
pub struct Point {
    pub x: u32,
    pub y: u32,
}
</pre>
</td>
<td>
<pre lang="rust">
# [ allow ( unused_attributes ) ]
# [ derive ( PartialEq , Debug , Default ) ]
pub struct Point {
    pub x: u32,
    pub y: u32,
}

# [ allow ( dead_code ) ]
impl Point {
    pub fn x(self, __value: u32) -> Point {
        Point { x: __value, ..self }
    }
    
    pub fn y(self, __value: u32) -> Point {
        Point { y: __value, ..self }
    }
    
    pub fn x_mut(&mut self, __value: u32) -> &mut Point {
        self.x = __value;
        self
    }
    
    pub fn y_mut(&mut self, __value: u32) -> &mut Point {
        self.y = __value;
        self
    }
}
</pre>
</td>
</tr>
</table>
### Usage of Code
```rust
// somewhere in your code base
//...
let p1: Point = Default::default().x(1).y(2);
let mut p2: Point = Default::default();
p1.x_mut(1).y_mut(2);
assert_eq!(p1, p2);
//...
```
## With a custom field prefix
<table border="0">
<tr>
<td>
Smelter
</td>
<td>
Generated Code
</td>
</tr>
<tr>
<td>
<pre lang="rust">
#![feature(proc_macro, custom_attribute)]

#[macro_use]
extern crate smelter;
#[derive(PartialEq, Builder, Default, Debug, Clone)]
#[smelter(prefix="with_")]
pub struct User {
    pub uid: u64,
    pub email: String,
    pub alias: String,
    pub friends: Vec<User>,
}
</pre>
</td>
<td>
<pre lang="rust">
# [ allow ( unused_attributes ) ]
# [ smelter ( prefix = "with_" ) ]
# [ derive ( PartialEq , Default , Debug , Clone ) ]
pub struct User {
    pub uid: u64,
    pub email: String,
    pub alias: String,
    pub friends: Vec<User>,
}
# [ allow ( dead_code ) ]
impl User {
    pub fn with_uid(self, __value: u64) -> User {
        User { uid: __value, ..self }
    }
    pub fn with_email(self, __value: String) -> User {
        User { email: __value, ..self }
    }
    pub fn with_alias(self, __value: String) -> User {
        User { alias: __value, ..self }
    }
    pub fn with_friends(self, __value: Vec<User>) -> User {
        User { friends: __value, ..self }
    }
    pub fn with_uid_mut(&mut self, __value: u64) -> &mut User {
        self.uid = __value;
        self
    }
    pub fn with_email_mut(&mut self, __value: String) -> &mut User {
        self.email = __value;
        self
    }
    pub fn with_alias_mut(&mut self, __value: String) -> &mut User {
        self.alias = __value;
        self
    }
    pub fn with_friends_mut(&mut self, __value: Vec<User>) -> &mut User {
        self.friends = __value;
        self
    }
}
</pre>
</td>
</tr>
</table>
### Usage of Code
```rust
// ... somewhere in your code
     let mut u1 = User::default();
// ...
     u1.with_email_mut("cardboardbox@example.com".to_string())
      .with_alias_mut("Cardboard box".to_string())
      .with_uid_mut(10u64);
      
// ... somewhere else
    let u2 = User::default()
                .with_email("filecabinate@example.com".to_string())
                .with_alias("File Cabinate".to_string())
                .with_uid(10u64);
```

## More Examples
For more examples see the [test.rs](https://github.com/Ivan1931/smelter/blob/master/tests/test.rs)
# Caveats
Currently this library will only work on a nightly build of rust.

It relies on [macros 1.1](https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md)