lombok 0.4.0

Lombok port for Rust
Documentation
use lombok::{
    AllArgsConstructor, Builder, Data, EqualsAndHashCode, Getter, GetterMut, NoArgsConstructor,
    Setter, ToString, Value,
};

#[derive(
    Getter,
    GetterMut,
    Setter,
    NoArgsConstructor,
    AllArgsConstructor,
    EqualsAndHashCode,
    Builder,
    ToString,
    Clone,
)]
pub struct TestFullFeaturedStructure<'a> {
    age: u8,
    nick: &'a str,
    languages: Vec<String>,
    hobby: Box<&'a str>,
}

#[derive(Data)]
struct TestDataStructure<'a> {
    age: u8,
    nick: &'a str,
}

#[derive(Value)]
struct TestValueStructure<'a> {
    age: u8,
    nick: &'a str,
}

#[cfg(test)]
#[allow(dead_code)]
mod tests {
    use crate::{TestDataStructure, TestFullFeaturedStructure, TestValueStructure};

    #[test]
    fn test_getter() {
        let default = TestFullFeaturedStructure::default();

        assert_eq!(&default.age, default.get_age());
        assert_eq!(default.nick, default.get_nick());
        assert_eq!(&default.languages, default.get_languages());
        assert_eq!(&default.hobby, default.get_hobby());
    }

    #[test]
    fn test_getter_mut() {
        let mut default = TestFullFeaturedStructure::default();
        *default.get_age_mut() = 10;
        *default.get_nick_mut() = "another";
        *default.get_languages_mut() = vec!["python".to_string()];
        *default.get_hobby_mut() = Box::new("tennis");

        let copy = TestFullFeaturedStructure::default();

        assert_ne!(copy.age, default.age);
        assert_ne!(copy.nick, default.nick);
        assert_ne!(copy.languages, default.languages);
        assert_ne!(copy.hobby, default.hobby);
    }

    #[test]
    fn test_setter() {
        let mut data = TestFullFeaturedStructure {
            age: Default::default(),
            nick: Default::default(),
            languages: Default::default(),
            hobby: Default::default(),
        };

        let default = TestFullFeaturedStructure::default();
        let clone_default = default.clone();

        data.set_age(clone_default.age);
        data.set_nick(clone_default.nick);
        data.set_languages(clone_default.languages);
        data.set_hobby(clone_default.hobby);

        assert_eq!(default.age, data.age);
        assert_eq!(default.nick, data.nick);
        assert_eq!(default.languages, data.languages);
        assert_eq!(default.hobby, data.hobby);
    }

    #[test]
    fn test_no_args_constructor() {
        let mut data = TestFullFeaturedStructure::new_default();

        let default = TestFullFeaturedStructure::default();
        let clone_default = default.clone();

        data.set_age(clone_default.age);
        data.set_nick(clone_default.nick);
        data.set_languages(clone_default.languages);
        data.set_hobby(clone_default.hobby);

        assert_eq!(default.age, data.age);
        assert_eq!(default.nick, data.nick);
        assert_eq!(default.languages, data.languages);
        assert_eq!(default.hobby, data.hobby);
    }

    #[test]
    fn test_all_args_constructor() {
        let default = TestFullFeaturedStructure::default();
        let clone_default = default.clone();

        let data = TestFullFeaturedStructure::new(
            clone_default.age,
            clone_default.nick,
            clone_default.languages,
            clone_default.hobby,
        );

        assert_eq!(default.age, data.age);
        assert_eq!(default.nick, data.nick);
        assert_eq!(default.languages, data.languages);
        assert_eq!(default.hobby, data.hobby);
    }

    #[test]
    fn test_equals_and_hashcode() {
        let default = TestFullFeaturedStructure::default();
        let mut adjusted_default = default.clone();

        assert!(&default.equals(&adjusted_default));
        assert_eq!(&default.hash_code(), &adjusted_default.hash_code());

        adjusted_default.age = 10;

        assert!(!&default.equals(&adjusted_default));
        assert_ne!(&default.hash_code(), &adjusted_default.hash_code());
    }

    #[test]
    fn test_to_string() {
        let default = TestFullFeaturedStructure::default();
        let string = default.to_string();
        assert_eq!(
            String::from(
                "TestFullFeaturedStructure { age: 0, nick: \"\", languages: [], hobby: \"\" }"
            ),
            string
        )
    }

    #[test]
    fn test_builder() {
        let default = TestFullFeaturedStructure::default();
        let clone_default = default.clone();

        let data = TestFullFeaturedStructure::builder()
            .age(clone_default.age)
            .nick(clone_default.nick)
            .languages(clone_default.languages)
            .hobby(clone_default.hobby)
            .build();

        assert_eq!(&default, &data);
    }

    #[test]
    fn test_data() {
        let mut data = TestDataStructure::new(28, "sokomishalov");

        data.set_age(29);

        assert_eq!(29, *data.get_age());
        assert_eq!("sokomishalov", data.get_nick());
        assert_eq!(
            String::from("TestDataStructure { age: 29, nick: \"sokomishalov\" }"),
            data.to_string()
        )
    }

    #[test]
    fn test_value() {
        let value = TestValueStructure::new(28, "sokomishalov");

        assert_eq!(28, *value.get_age());
        assert_eq!(
            String::from("TestValueStructure { age: 28, nick: \"sokomishalov\" }"),
            value.to_string()
        )
    }
}