1use bstr::{BStr, ByteSlice};
2
3pub 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 pub fn key(&self) -> &'l BStr {
21 self.src[..self.mid].as_bstr()
22 }
23
24 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}