sequence_domain 0.2.0

A DNA/RNA sequence domain
Documentation
use std::fmt::Display;

use crate::shared::errors::MalformedSequence;

use super::{
    rna_stuff::RnaSequenceValueObject,
    traits::{CharsValidEnsurer, SequenceValue},
    value_objects::SequenceValueObject,
};

/// DnaSequenceValueObject
/// some docs
#[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 {}