noodles_vcf/record/
alternate_bases.rs

1use std::{fmt, io, iter};
2
3use crate::variant::record::AlternateBases as _;
4
5/// VCF record alternate bases.
6pub struct AlternateBases<'a>(&'a str);
7
8const DELIMITER: char = ',';
9
10impl<'a> AlternateBases<'a> {
11    pub(super) fn new(src: &'a str) -> Self {
12        Self(src)
13    }
14}
15
16impl fmt::Debug for AlternateBases<'_> {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        f.debug_list().entries(self.iter()).finish()
19    }
20}
21
22impl AsRef<str> for AlternateBases<'_> {
23    fn as_ref(&self) -> &str {
24        self.0
25    }
26}
27
28impl crate::variant::record::AlternateBases for AlternateBases<'_> {
29    fn is_empty(&self) -> bool {
30        self.0.is_empty()
31    }
32
33    fn len(&self) -> usize {
34        if self.is_empty() {
35            0
36        } else {
37            self.iter().count()
38        }
39    }
40
41    fn iter(&self) -> Box<dyn Iterator<Item = io::Result<&str>> + '_> {
42        if self.is_empty() {
43            Box::new(iter::empty())
44        } else {
45            Box::new(self.0.split(DELIMITER).map(Ok))
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn test_is_empty() {
56        assert!(AlternateBases::new("").is_empty());
57        assert!(!AlternateBases::new("A").is_empty());
58        assert!(!AlternateBases::new("A,C").is_empty());
59    }
60
61    #[test]
62    fn test_len() {
63        assert_eq!(AlternateBases::new("").len(), 0);
64        assert_eq!(AlternateBases::new("A").len(), 1);
65        assert_eq!(AlternateBases::new("A,C").len(), 2);
66    }
67
68    #[test]
69    fn test_iter() -> io::Result<()> {
70        let alternate_bases = AlternateBases::new("");
71        assert!(alternate_bases.iter().next().is_none());
72
73        let alternate_bases = AlternateBases::new("A");
74        let actual: Vec<_> = alternate_bases.iter().collect::<io::Result<_>>()?;
75        let expected = ["A"];
76        assert_eq!(actual, expected);
77
78        let alternate_bases = AlternateBases::new("A,C");
79        let actual: Vec<_> = alternate_bases.iter().collect::<io::Result<_>>()?;
80        let expected = ["A", "C"];
81        assert_eq!(actual, expected);
82
83        Ok(())
84    }
85}