use std::fmt::Display;
use crate::shared::errors::MalformedSequence;
use super::{
rna_stuff::RnaSequenceValueObject,
traits::{CharsValidEnsurer, SequenceValue},
value_objects::SequenceValueObject,
};
#[derive(Debug, PartialEq, Eq)]
pub struct DnaSequenceValueObject(SequenceValueObject);
impl Display for DnaSequenceValueObject {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl DnaSequenceValueObject {
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::Dna,
))
}
}
pub fn get_sequence(&self) -> &str {
&self.0.value_of()
}
pub fn reverse(self) -> Self {
Self(self.0.reverse())
}
}
impl From<RnaSequenceValueObject> for DnaSequenceValueObject {
fn from(value: RnaSequenceValueObject) -> Self {
Self(SequenceValueObject::new(
&value.get_sequence().to_string().replace('u', "t"),
))
}
}
impl SequenceValue for DnaSequenceValueObject {
fn sequence_allowed_chars() -> [char; 4] {
['a', 't', 'g', 'c']
}
}
impl CharsValidEnsurer for DnaSequenceValueObject {}