sequence_domain 0.2.0

A DNA/RNA sequence domain
Documentation
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 {}