#[derive(Debug, PartialEq)] pub struct Dna(String); #[derive(Debug, PartialEq)] pub struct Rna(String); impl Dna { pub fn new(dna: &str) -> Result { dna.chars() .enumerate() .find(|(_, n)| !"ACGT".contains(*n)) .map_or_else(|| Ok(Dna(dna.to_string())), |(i, _)| Err(i)) } pub fn into_rna(self) -> Rna { Rna(self .0 .as_str() .chars() .map(|n| match n { 'A' => 'U', 'C' => 'G', 'G' => 'C', 'T' => 'A', a => a, }) .collect()) } } impl Rna { pub fn new(rna: &str) -> Result { rna.chars() .enumerate() .find(|(_, n)| !"ACGU".contains(*n)) .map_or_else(|| Ok(Rna(rna.to_string())), |(i, _)| Err(i)) } }