#[macro_export]
macro_rules! define_field_accessors {
($field_name:ident, $add_method:ident, $get_method:ident) => {
pub fn $add_method(&mut self, field: $crate::record::Field) {
self.$field_name.push(field);
}
#[must_use]
pub fn $get_method(&self) -> &[$crate::record::Field] {
&self.$field_name
}
};
}
#[macro_export]
macro_rules! filtered_field_accessor {
($field_name:ident, $tag:expr, $method_name:ident) => {
#[must_use]
pub fn $method_name(&self) -> Vec<&$crate::record::Field> {
self.$field_name.iter().filter(|f| f.tag == $tag).collect()
}
};
}
#[cfg(test)]
mod tests {
use crate::record::Field;
struct TestRecord {
fields: Vec<Field>,
}
impl TestRecord {
define_field_accessors!(fields, add_field_test, fields_test);
}
#[test]
fn test_define_field_accessors_macro() {
let mut record = TestRecord { fields: Vec::new() };
let field = Field::new("245".to_string(), '1', '0');
record.add_field_test(field);
assert_eq!(record.fields_test().len(), 1);
}
}