noodles_sam/header/record/
kind.rs1use std::{error, fmt, str::FromStr};
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7pub enum Kind {
8 Header,
10 ReferenceSequence,
12 ReadGroup,
14 Program,
16 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#[derive(Clone, Debug, Eq, PartialEq)]
34pub enum ParseError {
35 Empty,
37 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}