pub mod code;
pub mod substitution;
pub use self::code::Code;
use noodles_core::Position;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Feature {
Bases(Position, Vec<u8>),
Scores(Position, Vec<u8>),
ReadBase(Position, u8, u8),
Substitution(Position, substitution::Value),
Insertion(Position, Vec<u8>),
Deletion(Position, usize),
InsertBase(Position, u8),
QualityScore(Position, u8),
ReferenceSkip(Position, usize),
SoftClip(Position, Vec<u8>),
Padding(Position, usize),
HardClip(Position, usize),
}
impl Feature {
pub fn code(&self) -> Code {
match self {
Self::Bases(..) => Code::Bases,
Self::Scores(..) => Code::Scores,
Self::ReadBase(..) => Code::ReadBase,
Self::Substitution(..) => Code::Substitution,
Self::Insertion(..) => Code::Insertion,
Self::Deletion(..) => Code::Deletion,
Self::InsertBase(..) => Code::InsertBase,
Self::QualityScore(..) => Code::QualityScore,
Self::ReferenceSkip(..) => Code::ReferenceSkip,
Self::SoftClip(..) => Code::SoftClip,
Self::Padding(..) => Code::Padding,
Self::HardClip(..) => Code::HardClip,
}
}
pub fn position(&self) -> Position {
match self {
Self::Bases(pos, _) => *pos,
Self::Scores(pos, _) => *pos,
Self::ReadBase(pos, _, _) => *pos,
Self::Substitution(pos, _) => *pos,
Self::Insertion(pos, _) => *pos,
Self::Deletion(pos, _) => *pos,
Self::InsertBase(pos, _) => *pos,
Self::QualityScore(pos, _) => *pos,
Self::ReferenceSkip(pos, _) => *pos,
Self::SoftClip(pos, _) => *pos,
Self::Padding(pos, _) => *pos,
Self::HardClip(pos, _) => *pos,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_code() {
let position = Position::MIN;
assert_eq!(Feature::Bases(position, Vec::new()).code(), Code::Bases);
assert_eq!(Feature::Scores(position, Vec::new()).code(), Code::Scores);
assert_eq!(Feature::ReadBase(position, b'N', 0).code(), Code::ReadBase);
assert_eq!(
Feature::Substitution(position, substitution::Value::Code(0)).code(),
Code::Substitution
);
assert_eq!(
Feature::Insertion(position, Vec::new()).code(),
Code::Insertion
);
assert_eq!(Feature::Deletion(position, 0).code(), Code::Deletion);
assert_eq!(Feature::InsertBase(position, b'N').code(), Code::InsertBase);
assert_eq!(
Feature::QualityScore(position, 0).code(),
Code::QualityScore
);
assert_eq!(
Feature::ReferenceSkip(position, 0).code(),
Code::ReferenceSkip
);
assert_eq!(
Feature::SoftClip(position, Vec::new()).code(),
Code::SoftClip
);
assert_eq!(Feature::Padding(position, 0).code(), Code::Padding);
assert_eq!(Feature::HardClip(position, 0).code(), Code::HardClip);
}
#[test]
fn test_position() {
let position = Position::MIN;
assert_eq!(Feature::Bases(position, Vec::new()).position(), position);
assert_eq!(Feature::Scores(position, Vec::new()).position(), position);
assert_eq!(Feature::ReadBase(position, b'N', 0).position(), position);
assert_eq!(
Feature::Substitution(position, substitution::Value::Code(0)).position(),
position
);
assert_eq!(
Feature::Insertion(position, Vec::new()).position(),
position
);
assert_eq!(Feature::Deletion(position, 0).position(), position);
assert_eq!(Feature::InsertBase(position, b'N').position(), position);
assert_eq!(Feature::QualityScore(position, 0).position(), position);
assert_eq!(Feature::ReferenceSkip(position, 0).position(), position);
assert_eq!(Feature::SoftClip(position, Vec::new()).position(), position);
assert_eq!(Feature::Padding(position, 0).position(), position);
assert_eq!(Feature::HardClip(position, 0).position(), position);
}
}