cached_field 1.0.2

Proc macro to cache associate function result on strut field. An analogy to python's @cached_property class decorator.
Documentation
#[cfg(test)]
mod tests {
    use cached_field::cached_field;

    struct TestStruct {
        test: Option<u8>,
        test0: Option<u8>,
    }

    impl TestStruct {
        #[cached_field]
        fn test(&self) -> u8 {
            0
        }
        #[cached_field("test0")]
        fn test1(&self) -> u8 {
            3
        }
        #[cached_field(field = "test0")]
        pub fn test0(&self) -> u8 {
            5
        }
    }

    trait cache {
        fn test(&mut self) -> &Vec<u8>;
        fn test0(&mut self) -> &Vec<u8>;
    }
    struct TestStruct0 {
        test_borrow: Option<Vec<u8>>,
    }

    impl cache for TestStruct0 {
        #[cached_field("test_borrow", true)]
        fn test(&self) -> Vec<u8> {
            vec![3, 5]
        }

        #[cached_field(field = "test_borrow", borrow = true)]
        fn test0(&self) -> Vec<u8> {
            vec![3, 5]
        }
    }

    trait GCache<T> {
        fn test(&mut self) -> T;
    }

    struct GTestStruct<T> {
        test_generic: Option<T>,
        default: T,
    }

    impl<T: Copy + ToString> GCache<T> for GTestStruct<T> {
        #[cached_field("test_generic")]
        fn test(&self) -> T {
            self.default
        }
    }

    #[test]
    fn same_name_no_args_struct_impl() {
        assert_eq!(
            TestStruct {
                test: None,
                test0: None,
            }
            .test(),
            0
        );
        let mut obj = TestStruct {
            test: None,
            test0: None,
        };

        assert_eq!(0, obj.test());
    }

    #[test]
    fn diff_name_generic_impl() {
        assert_eq!(
            GTestStruct {
                test_generic: None,
                default: 10,
            }
            .test(),
            10
        );
    }

    #[test]
    fn diff_name_struct_impl() {
        assert_eq!(
            TestStruct {
                test: None,
                test0: None,
            }
            .test1(),
            3
        );
        let mut obj = TestStruct {
            test: None,
            test0: None,
        };

        assert_eq!(3, obj.test1());
    }

    #[test]
    fn diff_name_kv_struct_impl() {
        let mut obj = TestStruct {
            test: None,
            test0: None,
        };

        assert_eq!(5, obj.test0());
    }

    #[test]
    fn different_name_pos_args_trait_impl() {
        assert_eq!(*TestStruct0 { test_borrow: None }.test(), vec![3, 5]);
        let mut obj = TestStruct0 { test_borrow: None };

        assert_eq!(vec![3, 5], *obj.test());
        assert_eq!(vec![3, 5], *obj.test());
    }

    #[test]
    fn different_name_kv_trait_impl() {
        assert_eq!(*TestStruct0 { test_borrow: None }.test(), vec![3, 5]);
        let mut obj = TestStruct0 { test_borrow: None };

        assert_eq!(vec![3, 5], *obj.test0());
        assert_eq!(vec![3, 5], *obj.test());
    }
}