shrinkwraprs

Making wrapper types allows us to give more compile-time guarantees about our code being correct:

rust // Now we can't mix up widths and heights; the compiler will yell at us! struct Width(i64); struct Height(i64);

But... they're kind of a pain to work with. If you ever need to get at that wrapped i64, you need to constantly pattern-match back and forth to wrap and unwrap the values.

shrinkwraprs aims to alleviate this pain by allowing you to derive implementations of various conversion traits by attaching #[derive(Shrinkwrap)].

Traits implemented

Currently, shrinkwraprs derives the following traits for all structs:

Cool, how do I use it?

First, add shrinkwraprs as a dependency in your Cargo.toml:

```toml [dependencies]

shrinkwraprs = "0.0.2" ```

Then, just slap a #[derive(Shrinkwrap)] on any structs you want convenient-ified:

```rust

[macro_use] extern crate shrinkwraprs;

[derive(Shrinkwrap)]

struct Email(String);

fn main() { let email = Email("chiya+snacks@natsumeya.jp".into());

let isdiscriminatedemail = (*email).contains("+"); // Woohoo, we can use the email like a string!

/* ... */ } ```

If you have multiple fields, but there's only one field you want to be able to deref/borrow as, mark it with #[shrinkwrap(main_field)]:

```rust

[derive(Shrinkwrap)]

struct Email { spamminess: f64, #[shrinkwrap(main_field)] addr: String }

[derive(Shrinkwrap)]

struct CodeSpan(u32, u32, #[shrinkwrap(main_field)] Token); ```