simple-bind 0.1.6

One-line non-exhaustive binds
#![feature(proc_macro, proc_macro_non_items, stmt_expr_attributes, pattern_parentheses)]

extern crate simple_bind;

use simple_bind::bind;

enum B { Field(i32) }
enum A { Single(i32), Nested(B), Multi(i32, i32), Struct{x: i32}, Ref(String) }

#[test]
fn basic() {
  bind!{let A::Single(y) = A::Single(3);}
  assert_eq!(y, 3);
}

#[test]
fn capture() {
  let x = A::Single(3);
  bind!{let A::Single(y) = x;}
  assert_eq!(y, 3);
}

#[test]
fn multiple() {
  bind!{let A::Multi(x, y) = A::Multi(1, 2);}
  assert_eq!(x, 1);
  assert_eq!(y, 2);
}

#[test]
fn nested() {
  bind!{let A::Nested(B::Field(x)) = A::Nested(B::Field(1));}
  assert_eq!(x, 1);
}

#[test]
fn struct_() {
  let y = A::Struct{x: 1};
  bind!{let A::Struct{x} = y;}
  assert_eq!(x, 1);
}

#[test]
fn ref_() {
  let x = A::Ref(String::from("Hello"));
  bind!{let &A::Ref(ref y) = &x;}
  assert_eq!(y, "Hello");
}

#[test]
fn mut_ref() {
  let mut x = A::Ref(String::from("Hello"));
  bind!{let &mut A::Ref(ref mut y) = &mut x;}
  *y = String::from("Hi");
}

#[test]
fn mut_ref2() {
  let mut x = A::Single(1);
  bind!{let &mut A::Single(ref mut y) = &mut x;}
  *y = 2;
}

#[test]
fn wildcard() {
  bind!{let A::Multi(_, x) = A::Multi(1, 2);}
  assert_eq!(x, 2);
}

#[test]
fn struct_ref() {
  let x = A::Struct{x: 1};
  bind!{let A::Struct{x: ref y} = x;}
  assert_eq!(*y, 1);
}