noodles_sam/header/record/
kind.rs

1//! SAM header record kind.
2
3use std::{error, fmt, str::FromStr};
4
5/// A SAM header record kind.
6#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7pub enum Kind {
8    /// Header (`HD`).
9    Header,
10    /// Reference sequence (`SQ`).
11    ReferenceSequence,
12    /// Read group (`RG`).
13    ReadGroup,
14    /// Program (`PG`).
15    Program,
16    /// Comment (`CO`).
17    Comment,
18}
19
20impl AsRef<str> for Kind {
21    fn as_ref(&self) -> &str {
22        match self {
23            Self::Header => "HD",
24            Self::ReferenceSequence => "SQ",
25            Self::ReadGroup => "RG",
26            Self::Program => "PG",
27            Self::Comment => "CO",
28        }
29    }
30}
31
32/// An error returned when a raw SAM header record kind fails to parse.
33#[derive(Clone, Debug, Eq, PartialEq)]
34pub enum ParseError {
35    /// The input is empty.
36    Empty,
37    /// The input is invalid.
38    Invalid,
39}
40
41impl error::Error for ParseError {}
42
43impl fmt::Display for ParseError {
44    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
45        match self {
46            Self::Empty => f.write_str("empty input"),
47            Self::Invalid => f.write_str("invalid input"),
48        }
49    }
50}
51
52impl FromStr for Kind {
53    type Err = ParseError;
54
55    fn from_str(s: &str) -> Result<Self, Self::Err> {
56        match s {
57            "" => Err(ParseError::Empty),
58            "@HD" => Ok(Self::Header),
59            "@SQ" => Ok(Self::ReferenceSequence),
60            "@RG" => Ok(Self::ReadGroup),
61            "@PG" => Ok(Self::Program),
62            "@CO" => Ok(Self::Comment),
63            _ => Err(ParseError::Invalid),
64        }
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn test_from_str() {
74        assert_eq!("@HD".parse(), Ok(Kind::Header));
75        assert_eq!("@SQ".parse(), Ok(Kind::ReferenceSequence));
76        assert_eq!("@RG".parse(), Ok(Kind::ReadGroup));
77        assert_eq!("@PG".parse(), Ok(Kind::Program));
78        assert_eq!("@CO".parse(), Ok(Kind::Comment));
79
80        assert_eq!("".parse::<Kind>(), Err(ParseError::Empty));
81        assert_eq!("@NO".parse::<Kind>(), Err(ParseError::Invalid));
82        assert_eq!("HD".parse::<Kind>(), Err(ParseError::Invalid));
83    }
84}