• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / bibdata / 4555e222-4ff3-4770-bea6-771afcdcfead

19 Aug 2025 03:53PM UTC coverage: 92.112% (+0.1%) from 91.991%
4555e222-4ff3-4770-bea6-771afcdcfead

Pull #2866

circleci

sandbergja
Migrate recap_notes_display to Rust
Pull Request #2866: Migrate recap_notes_display to Rust

72 of 91 new or added lines in 4 files covered. (79.12%)

7135 of 7746 relevant lines covered (92.11%)

412.47 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.83
/lib/bibdata_rs/src/marc/scsb/recap_partner.rs
1
use marctk::Record;
2
use std::str::FromStr;
3

4
use super::{collection_group::collection_groups, is_scsb};
5

6
#[derive(Debug, PartialEq)]
7
pub enum RecapPartner {
8
    ColumbiaUniversityLibrary,
9
    HarvardLibrary,
10
    NewYorkPublicLibrary,
11
}
12

13
impl RecapPartner {
14
    fn display_code(&self) -> char {
1✔
15
        match self {
1✔
16
            Self::ColumbiaUniversityLibrary => 'C',
1✔
NEW
17
            Self::HarvardLibrary => 'H',
×
NEW
18
            Self::NewYorkPublicLibrary => 'N',
×
19
        }
20
    }
1✔
21
}
22

23
#[derive(Debug, PartialEq)]
24
pub struct NoSuchRecapPartner;
25

26
impl FromStr for RecapPartner {
27
    type Err = NoSuchRecapPartner;
28

29
    fn from_str(s: &str) -> Result<Self, Self::Err> {
2✔
30
        if s.trim() == "scsbcul" {
2✔
31
            Ok(Self::ColumbiaUniversityLibrary)
1✔
32
        } else if s.trim() == "scsbhl" {
1✔
NEW
33
            Ok(Self::HarvardLibrary)
×
34
        } else if s.trim() == "scsbnypl" {
1✔
35
            Ok(Self::NewYorkPublicLibrary)
1✔
36
        } else {
NEW
37
            Err(NoSuchRecapPartner)
×
38
        }
39
    }
2✔
40
}
41

42
impl TryFrom<&Record> for RecapPartner {
43
    type Error = NoSuchRecapPartner;
44

45
    fn try_from(record: &Record) -> Result<Self, Self::Error> {
3✔
46
        if !is_scsb(record) || record.get_field_values("852", "0").is_empty() {
3✔
47
            return Err(NoSuchRecapPartner);
1✔
48
        }
2✔
49
        match record.get_field_values("852", "b").first() {
2✔
50
            Some(partner_code) => RecapPartner::from_str(partner_code),
2✔
NEW
51
            None => Err(NoSuchRecapPartner),
×
52
        }
53
    }
3✔
54
}
55

56
pub fn recap_partner_notes(record: &Record) -> Vec<String> {
2✔
57
    if !is_scsb(record) {
2✔
NEW
58
        return vec![];
×
59
    }
2✔
60
    let record_partner = RecapPartner::try_from(record);
2✔
61
    match record_partner {
2✔
62
        Ok(partner) => collection_groups(record)
1✔
63
            .iter()
1✔
64
            .map(|group| format!("{} - {}", partner.display_code(), group.code()))
1✔
65
            .collect(),
1✔
66
        Err(_) => vec![],
1✔
67
    }
68
}
2✔
69

70
#[cfg(test)]
71
mod tests {
72
    use super::*;
73

74
    #[test]
75
    fn it_can_identify_nypl() {
1✔
76
        let record = Record::from_breaker(
1✔
77
            r#"=001 SCSB-8157262
1✔
78
=852 \\ $hJSM 95-217$09887434$bscsbnypl"#,
1✔
79
        )
80
        .unwrap();
1✔
81
        assert_eq!(
1✔
82
            RecapPartner::try_from(&record),
1✔
83
            Ok(RecapPartner::NewYorkPublicLibrary)
84
        );
85
    }
1✔
86

87
    mod recap_partner_notes {
88
        use super::*;
89
        #[test]
90
        fn it_can_create_a_columbia_open_note() {
1✔
91
            let record = Record::from_breaker(
1✔
92
                r#"=001 SCSB-9336516
1✔
93
=852 \\ $hAB Aj11$09760430$bscsbcul
1✔
94
=876 \\ $09760430$32006:June-Dec.$a15469769$hIn Library Use$jAvailable$pAR01836099$t1$xOpen$zAR$lRECAP"#,
1✔
95
            )
96
            .unwrap();
1✔
97
            assert_eq!(recap_partner_notes(&record), vec!["C - O".to_owned()]);
1✔
98
        }
1✔
99

100
        #[test]
101
        fn it_does_not_create_a_note_if_852_has_no_subfield_zero() {
1✔
102
            let record = Record::from_breaker(
1✔
103
                r#"=001 SCSB-9336516
1✔
104
=852 \\ $hAB Aj11$bscsbcul
1✔
105
=876 \\ $09760430$32006:June-Dec.$a15469769$hIn Library Use$jAvailable$pAR01836099$t1$xOpen$zAR$lRECAP"#,
1✔
106
            )
107
            .unwrap();
1✔
108
            assert!(recap_partner_notes(&record).is_empty());
1✔
109
        }
1✔
110
    }
111
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc