use std::fmt::Display;
use crate::shared::errors::MalformedSequence;
use super::{
dna_stuff::DnaSequenceValueObject,
traits::{CharsValidEnsurer, SequenceValue},
value_objects::SequenceValueObject,
};
#[derive(Debug, PartialEq, Eq)]
pub struct RnaSequenceValueObject(SequenceValueObject);
impl RnaSequenceValueObject {
pub fn new(value: &str) -> Result<Self, MalformedSequence> {
let self_allowed_characters: [char; 4] = Self::sequence_allowed_chars();
let invalid_chars = Self::invalid_chars(self_allowed_characters.to_vec(), value);
if invalid_chars.is_empty() {
Ok(Self(SequenceValueObject::new(value)))
} else {
Err(MalformedSequence::new(
invalid_chars,
super::SequenceType::Rna,
))
}
}
pub fn reverse(self) -> Self {
Self(self.0.reverse())
}
pub fn get_sequence(&self) -> &str {
&self.0.value_of()
}
}
impl Display for RnaSequenceValueObject {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl SequenceValue for RnaSequenceValueObject {
fn sequence_allowed_chars() -> [char; 4] {
['a', 'u', 'g', 'c']
}
}
impl From<DnaSequenceValueObject> for RnaSequenceValueObject {
fn from(value: DnaSequenceValueObject) -> Self {
Self(SequenceValueObject::new(
&value.get_sequence().replace('t', "u"),
))
}
}
impl CharsValidEnsurer for RnaSequenceValueObject {}