Skip to main content

noodles_gff/
directive.rs

1use bstr::{BStr, ByteSlice};
2
3/// A GFF directive.
4pub struct Directive<'l> {
5    src: &'l [u8],
6    mid: usize,
7}
8
9impl<'l> Directive<'l> {
10    pub(super) fn new(src: &'l [u8]) -> Self {
11        let mid = src
12            .iter()
13            .position(|b| b.is_ascii_whitespace())
14            .unwrap_or(src.len());
15
16        Self { src, mid }
17    }
18
19    /// Returns the key.
20    pub fn key(&self) -> &'l BStr {
21        self.src[..self.mid].as_bstr()
22    }
23
24    /// Returns the value.
25    pub fn value(&self) -> Option<&'l BStr> {
26        self.src.get(self.mid + 1..).map(|s| s.as_bstr())
27    }
28}
29
30impl AsRef<[u8]> for Directive<'_> {
31    fn as_ref(&self) -> &[u8] {
32        self.src
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn test_key() {
42        let directive = Directive::new(b"gff-version 3");
43        assert_eq!(directive.key(), "gff-version");
44
45        let directive = Directive::new(b"FASTA");
46        assert_eq!(directive.key(), "FASTA");
47    }
48
49    #[test]
50    fn test_value() {
51        let directive = Directive::new(b"gff-version 3");
52        assert_eq!(directive.value(), Some(BStr::new("3")));
53
54        let directive = Directive::new(b"FASTA");
55        assert!(directive.value().is_none());
56    }
57}