noodles_vcf/record/
alternate_bases.rs1use std::{fmt, io, iter};
2
3use crate::variant::record::AlternateBases as _;
4
5pub 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}