#[derive(Getter)]
{
// Attributes available to this derive:
#[get]
}
Expand description
A procedural macro that automatically generates getter methods for struct and enum fields.
This macro derives getter methods with configurable visibility and return type behavior. The generated getters can return either references to field values or cloned copies, with support for Option and Result types.
§Supported Attributes
#[get(pub)]- Generates a public getter with reference return type#[get(pub, reference)]- Generates a public getter that returns a reference (&T)#[get(pub, clone)]- Generates a public getter that returns a cloned value (T)#[get(pub, copy)]- Generates a public getter that returns a copy of the field value (self.field) for Copy types#[get(pub, deref)]- Generates a public getter that returns a dereferenced value (*field) with enhanced match control for Option/Result types#[get(pub(crate))]- Generates a crate-visible getter#[get(private)]- Generates a private getter
§Return Type Behavior
reference- Returns&T- a reference to the field valueclone- ReturnsT- a cloned copy of the field valuecopy- ReturnsT- a copy of the field value (self.field) for types implementing Copy traitderef- Returns dereferenced values with enhanced match control:Option<T>→Twith detailed None panic messagesResult<T, E>→Twith detailed Err panic messagesBox<T>→Tby dereferencing the boxRc<T>→Tby cloning the inner valueArc<T>→Tby cloning the inner value- Other types →
Tby dereferencing
- Default behavior: Returns
&Tfor non-Option/Result types,Tfor Option/Result types
§Default Behavior Details
- Non-Option/Result types: Returns
&T(reference to field) - Option/Result types: Returns
T(cloned value) to avoid exposing internal references - This ensures safe access patterns while maintaining performance for common use cases
§Examples
§Basic Usage
use lombok_macros::*;
#[derive(Getter, Clone)]
struct BasicStruct {
#[get(pub)]
name: String,
#[get(pub, type(reference))]
description: String,
#[get(pub, type(clone))]
data: Vec<i32>,
#[get(pub, type(copy))]
count: i32,
}
let basic = BasicStruct {
name: "test".to_string(),
description: "description".to_string(),
data: vec![1, 2, 3],
count: 42,
};
let name_ref: &String = basic.get_name();
let description_ref: &String = basic.get_description();
let data_clone: Vec<i32> = basic.get_data();
let count_copy: i32 = basic.get_count();
assert_eq!(*name_ref, "test");
assert_eq!(*description_ref, "description");
assert_eq!(data_clone, vec![1, 2, 3]);
assert_eq!(count_copy, 42);§Option and Result Types
use lombok_macros::*;
#[derive(Getter, Clone)]
struct OptionalStruct {
#[get(pub)]
optional: Option<String>,
#[get(pub, type(reference))]
optional_ref: Option<String>,
#[get(pub)]
result: Result<String, String>,
}
let opt_struct = OptionalStruct {
optional: Some("value".to_string()),
optional_ref: Some("ref_value".to_string()),
result: Ok("success".to_string()),
};
let optional_value: String = opt_struct.get_optional();
let optional_reference: &Option<String> = opt_struct.get_optional_ref();
let result_value: String = opt_struct.get_result();
assert_eq!(optional_value, "value");
assert_eq!(*optional_reference, Some("ref_value".to_string()));
assert_eq!(result_value, "success");§Tuple Structs
use lombok_macros::*;
#[derive(Getter, Clone)]
struct TupleStruct(
#[get(pub)] String,
#[get(pub, type(clone))] Vec<i32>,
);
let tuple = TupleStruct("hello".to_string(), vec![1, 2, 3]);
let field0: &String = tuple.get_0();
let field1: Vec<i32> = tuple.get_1();
assert_eq!(*field0, "hello");
assert_eq!(field1, vec![1, 2, 3]);§Copy Return Type
use lombok_macros::*;
#[derive(Getter, Clone)]
struct CopyStruct {
#[get(pub, type(copy))]
value: i32,
#[get(pub, type(copy))]
flag: bool,
#[get(pub, type(copy))]
count: u64,
}
let copy_struct = CopyStruct {
value: 42,
flag: true,
count: 1000,
};
let copied_value: i32 = copy_struct.get_value();
let copied_flag: bool = copy_struct.get_flag();
let copied_count: u64 = copy_struct.get_count();
assert_eq!(copied_value, 42);
assert_eq!(copied_flag, true);
assert_eq!(copied_count, 1000);§Deref Return Type with Enhanced Match Control
use lombok_macros::*;
#[derive(Getter, Clone)]
struct DerefStruct {
#[get(pub, type(deref))]
optional: Option<bool>,
#[get(pub, type(deref))]
result: Result<String, &'static str>,
#[get(pub, type(deref))]
boxed_value: Box<i32>,
#[get(pub, type(deref))]
rc_value: std::rc::Rc<String>,
#[get(pub, type(deref))]
arc_value: std::sync::Arc<Vec<u8>>,
}
let deref_struct = DerefStruct {
optional: Some(true),
result: Ok("success".to_string()),
boxed_value: Box::new(100),
rc_value: std::rc::Rc::new("test".to_string()),
arc_value: std::sync::Arc::new(vec![1, 2, 3]),
};
let optional_value: bool = deref_struct.get_optional();
let result_value: String = deref_struct.get_result();
let boxed_value: i32 = deref_struct.get_boxed_value();
let rc_value: String = deref_struct.get_rc_value();
let arc_value: Vec<u8> = deref_struct.get_arc_value();
assert_eq!(optional_value, true);
assert_eq!(result_value, "success");
assert_eq!(boxed_value, 100);
assert_eq!(rc_value, "test");
assert_eq!(arc_value, vec![1, 2, 3]);§Generics and Lifetimes
use lombok_macros::*;
#[derive(Getter, Clone)]
struct GenericStruct<'a, T: Clone> {
#[get(pub)]
value: &'a T,
#[get(pub, type(clone))]
owned: T,
}
let data = 42;
let generic = GenericStruct {
value: &data,
owned: 42,
};
let value_ref: &i32 = generic.get_value();
let owned_clone: i32 = generic.get_owned();
assert_eq!(*value_ref, 42);
assert_eq!(owned_clone, 42);