constructivist 0.3.0

Simplify the construction of structured data.
Documentation
## About

`constructivist` is the way to deliver `constructivism` into your crate.

## The Problem

At some point you will realise that `construtivism` is fucken awesome. And you want to use it in your crate. Let's call this crate `polako`, just for example. And it also could happen that your crate is about to work with another crate (or framework, or engine), let's say it is about to work with `bevy` (for example of course). You will meet one irresistible problem in this case: you can't implement a foreign trait for a foreign type. You can't implement `constructivism::Construct` for `bevy::Sprite` from your thouthend-times-amazing `polako` crate.

This is how you become a `constructivist`.

`constructivis`*`t`* allows you to inline the `constructivis`*`m`* into your crate. But. You are supposed to complete some steps.

## The Solution

I assume that you are using workspace and your crates live inside the `crates` folder. There is also required naming convention with a single constraint: if your main crate is called `awesomecrate`, then your constructivism crate have to be called `awesomecrate_constructivism`. You can inspect how the real `polako` inlines constructivism here: [https://github.com/jkb0o/polako/tree/eml](https://github.com/jkb0o/polako/tree/eml)

#### Step 1: Create your macro crate

1. You have to create (or use existed) your own macro crate to implement your version of `constructivism_macro`. This is how you can create your `polako_macro` crate:

```bash
# in your favorite terminal:
cd crates
mkdir polako_macro
cd polako_macro
cargo init --lib
cargo add syn proc_macro2 quote constructivist
```

2. If it is new macro crate, you have to edit `Cargo.toml` of this crate, and make this crate `proc_macro` crate:
```toml
# crates/polako_macro/Cargo.toml
[lib]
proc-macro = true
```

3. You have to inline `constructivism_macro` into your crate:
```rust
// crates/polako_macro/src/lib.rs
implement_constructivism_macro!("polako");
```

4. You can use all the power of `constructivism_macro` in your crate.

#### Step 2: Create your constructivism crate

1. You need to inline all traits and implementations of `constructivism` in your crate:

```bash
# we are in constructivism_macro dir for now, go back to crates
cd ../
mkdir polako_constructivism
cargo init --lib
cargo add --path ../polako_macro

# you most probably want to have your third-parti crate as dependency
cargo add bevy
```

2. At this point, you can use constructivism derives and proc macros in you crate. It meansyou can implement constructivism now:

```rust
// crates/polako_constructivism/src/lib.rs
pub use polako_macro::*;
// 32 is the maximum params limit, see (TODO: link the explanation)
implement_constructivism!(32);
```

#### Step 3: Add bindings to all your needs

1. From now, you are working with crate that defines & implements constructivism structs & traits. An this is the point where you can bridge the third-party crate. `bevy` in our example. Add the bridge mod to your crate:

```rust
// crates/polako_constructivism/src/lib.rs
pub use polako_macro::*;
implement_constructivism!(32);

// add bridge mod:
mod bridge
```

2. Provide implementations for the third-party crate:

```rust
// crates/polako_constructivism/src/bridge.rs
use bevy::prelude::*;
use polaco_macro::*;

derive_construct! {
    NodeBundle -> Nothing () {
        NodeBundle::default()
    }
}
```

#### Step 4: Add constructivism mod to your crate root

1. As you already guessed, the name of the root crate in this tutorial is `polako`. So, you HAVE to add `constructivism` mod to your root crate to make it all work everywhere:

```rust
// src/lib.rs
pub mod constructivism {
    // this is required:
    pub use polako_constructivism::*;
    pub use polako_macro::*;

    // this is optional (but nice):
    pub mod prelude {
        pub use polako_constructivism::prelude::*;
        pub use polako_macro::*;
    }
}
```

#### Step 5: Give the Feedback

1. All the stuff you done won't compile in most cases (becouse I've tested only single case). 
2. Go to github and write an [issue](https://github.com/jkb0o/polako/issues) about how life is hard without constructivism and cry about this damn tutorial that just won't work as expected.
3. (Optional) Find the source of the problem and provide a *beautiful* PR.

#### Step 6: Overcome the Suffering

1. You followed this tutorial and implemented constructivism more then once.
2. You wonder - why there is no tools that automate all of these steps?
3. You realize - it is becouse nobody wrote these tools yet.
4. You implement `cargo-bootstrap-constructivism` (ask me how), provide astonished PR, and make this crate even better.

## License (boring)

The `constructivist` is dual-licensed under either:

- MIT License ([LICENSE-MIT](LICENSE-MIT) or [http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT))
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))

This means you can select the license you prefer!
This dual-licensing approach is the de-facto standard in the Rust ecosystem and there are [very good reasons](https://github.com/bevyengine/bevy/issues/2373) to include both.