rental 0.5.6

A macro to generate safe self-referential structs, plus premade types for common use cases.
Documentation
#[macro_use]
extern crate rental;


pub struct Foo<T: 'static> {
	t: T,
}

impl<T: 'static> Foo<T> {
	fn try_borrow(&self) -> Result<&T, ()> { Ok(&self.t) }
	fn fail_borrow(&self) -> Result<&T, ()> { Err(()) }
}


rental! {
	mod rentals {
		type FooAlias<T> = super::Foo<T>;

		#[rental]
		pub struct SimpleRef<T: 'static> {
			foo: Box<FooAlias<T>>,
			tref: &'foo T,
		}
	}
}


#[test]
fn new() {
	let foo = Foo { t: 5 };
	let _ = rentals::SimpleRef::new(Box::new(foo), |foo| &foo.t);

	let foo = Foo { t: 5 };
	let sr = rentals::SimpleRef::try_new(Box::new(foo), |foo| foo.try_borrow());
	assert!(sr.is_ok());

	let foo = Foo { t: 5 };
	let sr = rentals::SimpleRef::try_new(Box::new(foo), |foo| foo.fail_borrow());
	assert!(sr.is_err());
}


#[test]
fn read() {
	let foo = Foo { t: 5 };

	let sr = rentals::SimpleRef::new(Box::new(foo), |foo| &foo.t);
	let t: i32 = sr.rent(|tref| **tref);
	assert_eq!(t, 5);

	let tref: &i32 = sr.ref_rent(|tref| *tref);
	assert_eq!(*tref, 5);
}