aboutsummaryrefslogtreecommitdiff
path: root/rust/rna-transcription/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/rna-transcription/src/lib.rs')
-rw-r--r--rust/rna-transcription/src/lib.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/rust/rna-transcription/src/lib.rs b/rust/rna-transcription/src/lib.rs
new file mode 100644
index 0000000..425f406
--- /dev/null
+++ b/rust/rna-transcription/src/lib.rs
@@ -0,0 +1,38 @@
1#[derive(Debug, PartialEq)]
2pub struct Dna(String);
3
4#[derive(Debug, PartialEq)]
5pub struct Rna(String);
6
7impl Dna {
8 pub fn new(dna: &str) -> Result<Dna, usize> {
9 dna.chars()
10 .enumerate()
11 .find(|(_, n)| !"ACGT".contains(*n))
12 .map_or_else(|| Ok(Dna(dna.to_string())), |(i, _)| Err(i))
13 }
14
15 pub fn into_rna(self) -> Rna {
16 Rna(self
17 .0
18 .as_str()
19 .chars()
20 .map(|n| match n {
21 'A' => 'U',
22 'C' => 'G',
23 'G' => 'C',
24 'T' => 'A',
25 a => a,
26 })
27 .collect())
28 }
29}
30
31impl Rna {
32 pub fn new(rna: &str) -> Result<Rna, usize> {
33 rna.chars()
34 .enumerate()
35 .find(|(_, n)| !"ACGU".contains(*n))
36 .map_or_else(|| Ok(Rna(rna.to_string())), |(i, _)| Err(i))
37 }
38}