Skip to content

Commit

Permalink
Implement FieldRef::find (#807)
Browse files Browse the repository at this point in the history
Signed-off-by: Nico Wagner <[email protected]>
  • Loading branch information
nwagner84 authored Aug 26, 2024
1 parent c257011 commit b2a3974
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
35 changes: 35 additions & 0 deletions crates/pica-record/src/field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,41 @@ impl<'a> FieldRef<'a> {
.any(|subfield| subfield.code() == code)
}

/// Searches for the first subfield that satisfies the given
/// predicate.
///
/// # Example
///
/// ```rust
/// use pica_record::{FieldRef, SubfieldRef};
///
/// # fn main() { example().unwrap(); }
/// fn example() -> anyhow::Result<()> {
/// let field = FieldRef::new(
/// "012A",
/// Some("01"),
/// vec![('a', "b"), ('c', "d")],
/// );
///
/// assert_eq!(
/// field.find(|subfield| subfield.code() == 'a').unwrap(),
/// &SubfieldRef::new('a', "b")
/// );
///
/// assert!(field
/// .find(|subfield| subfield.code() == 'b')
/// .is_none());
///
/// Ok(())
/// }
/// ```
pub fn find<F>(&self, predicate: F) -> Option<&SubfieldRef>
where
F: Fn(&&SubfieldRef) -> bool,
{
self.subfields().iter().find(predicate)
}

/// Returns an [`std::str::Utf8Error`](Utf8Error) if the field
/// contains invalid UTF-8 data, otherwise the unit.
///
Expand Down
12 changes: 12 additions & 0 deletions crates/pica-record/tests/field/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,18 @@ fn field_ref_subfields() {
assert!(field.subfields().is_empty());
}

#[test]
fn field_ref_find() {
let subfield = SubfieldRef::try_from(('9', "040269019")).unwrap();
let field = FieldRef::new("041A", None, vec![('9', "040269019")]);

assert!(field.find(|subfield| subfield.code() == '8').is_none());
assert_eq!(
field.find(|subfield| subfield.code() == '9').unwrap(),
&subfield
);
}

#[test]
fn field_ref_contains() {
let field = FieldRef::new(
Expand Down

0 comments on commit b2a3974

Please sign in to comment.