onionpack 1.0.0

Unpack your structs into DTOs, Entities and Schemas.
Documentation
# Unpacked examples

This crate provides 3 macro:
- Derive `OnionPack` - Expands struct into 3 child structs: `<name>Scheme`, `<name>Dto`, `<name>Entity`.
- Attribute `onion_derive` - Appends derives to the child structs.
- Attribute `onion_dist` - Appends child structs with choosen fields.

## Minimal - Simple expanding

If we just slap `OnionPack` into struct crate will generate 3 child structs.

<details>
<summary>Before</summary>

```rust
  #[derive(onionpack::OnionPack)]
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }
```

</details>

<details>
<summary>After</summary>

```rust
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  pub struct UserScheme {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  pub struct UserDto {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  pub struct UserEntity {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }
```

</details>

### Derives - Expanding with distinct derives

`onion_derive` allows you to add derives to the child structs.

<details>
<summary>Before</summary>

```rust
  #[derive(onionpack::OnionPack)]
  #[onion_derive(
    all(Debug),         // This derives will be on top of all children structs
    dto(PartialEq, Eq), // This derives will be on top of `UserDto`
    entity(Clone)       // This derives will be on top of `UserEntity`
    // There is also `scheme(...)` variant
  )]
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }
```

</details>

<details>
<summary>After</summary>

```rust
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  #[derive(Debug)]                // <--- all(...) + scheme(...)
  pub struct UserScheme {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  #[derive(Debug, PartialEq, Eq)] // <--- all(...) + dto(...)
  pub struct UserDto {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  #[derive(Debug, Clone)]         // <--- all(...) + entity(...)
  pub struct UserEntity {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }
```

</details>

### Fields - Expanding with distinct fields

`onion_dist` allows you to control which fields will be in the child structs.

It can have 4 values:
- `none` - this field will no appear in the child structs.
- `scheme` - this field will appear only in `<name>Scheme` struct.
- `dto` - this field will appear only in `<name>Dto` struct.
- `entity` - this field will appear only in `<name>Entity` struct.

You can specify multiple values at the same time.

<details>
<summary>Before</summary>

```rust
  #[derive(onionpack::OnionPack)]
  struct User {
    name: String,
    #[onion_dist(dto, entity)]
    password_hash: String,
    #[onion_dist(none)]
    hidden_value: i32,
  }
```

</details>

<details>
<summary>After</summary>

```rust
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  pub struct UserScheme {
    name: String,
    // no hidden_value because it have `none`
    // no password_hash because it appear only in `dto` and `entity`
  }

  pub struct UserDto {
    name: String,
    password_hash: String,
    // no hidden_value because it have `none`
  }

  pub struct UserEntity {
    name: String,
    password_hash: String,
    // no hidden_value because it have `none`
  }
```

</details>


### Full - full example, derives+fields


<details>
<summary>Before</summary>

```rust
  #[derive(onionpack::OnionPack)]
  #[onion_derive(
    all(Debug),
    dto(PartialEq, Eq),
    entity(Clone)
  )]
  struct User {
    name: String,
    #[onion_dist(dto, entity)]
    password_hash: String,
    #[onion_dist(none)]
    hidden_value: i32,
  }
```

</details>

<details>
<summary>After</summary>

```rust
  struct User {
    name: String,
    password_hash: String,
    hidden_value: i32,
  }

  #[derive(Debug)]
  pub struct UserScheme {
    name: String,
  }

  #[derive(Debug, PartialEq, Eq)]
  pub struct UserDto {
    name: String,
    password_hash: String,
  }

  #[derive(Debug, Clone)]
  pub struct UserEntity {
    name: String,
    password_hash: String,
  }
```

</details>