Derive Macro Setter

Source
#[derive(Setter)]
{
    // Attributes available to this derive:
    #[exclude_setter]
    #[include_setter]
}
Expand description

Автоопределение set методов для полей именованых структур.

По умолчанию все поля включены в определение set_ методов. Также с помощью атрибутов можно опционально исключать полe из определния set_ метода, а также включать.

  • Аттрибут exclude_setter исключает поле из полей по умолчанию;
  • Аттрибут include_setter заставляет макрос определять метод set_ только для полей с этим атрибутом.

§Конфликты атрибутов

  • Поле не может иметь одновременно исключающее и включающее поле, они препятсвуют работе друг друга;
  • Поле не может быть исключающим, если какое-либо поле до него было определено как включающее, и наоборот.

§Реализация по умолчанию

use std_reset_macros::Setter;

#[derive(Setter, Clone, Copy, Default, PartialEq, Debug)]
struct Tmp {
    first: i32,
    second: i32,
}
let tmp = Tmp::default().set_first(2).set_second(3);
assert_eq!(
    tmp,
    Tmp {
        first: 2,
        second: 3
    }
);

§Исключающие поля

C помощью атрибута exclude_setter можно исключить поле из определения set_ метода, таким образом метод будет определен только для дефолтных полей.

§Пример

#[derive(Setter, Clone, Copy, Default, PartialEq, Debug)]
struct Tmp {
    first: i32,
    #[exclude_setter]
    second: i32,
}

– здесь метод set_ определен только для поля first.

§Включающие поля

Если есть хотябы одно поле с атрибутом include_setter, это значит, что макрос перестает опрделеять методы set_ для полей по умолчанию, а начал назначать их для полей с атрибутом include_setter.

§Пример

#[derive(Setter, Clone, Copy, Default, PartialEq, Debug)]
struct Tmp {
    #[include_setter]
    first: i32,
    second: i32,
    #[include_setter]    
    third: i32
}

– здесь метод set_ определен только для полей first и third.