on_off_sequence_output/
morse.rs1#[derive(Debug)]
5pub enum MorseError {
6 UnsupportedCode,
7 SequenceTooLong,
8}
9
10pub fn str_to_morse(input: &str) -> Result<(u128, u16), MorseError> {
35 let mut sequence = 0b_0_u128;
36 let mut len = 0_u16;
37 for c in input.chars() {
38 let (char_code, char_len) = char_to_morse(c)?;
39 if (len + char_len) > 127 {
40 return Err(MorseError::SequenceTooLong);
41 }
42
43 let mut char_code: u128 = char_code.into(); char_code = char_code << len;
45 len += char_len;
46 sequence = sequence | char_code;
47 }
48 Ok((sequence, len))
49}
50
51fn char_to_morse(morse_character: char) -> Result<(u32, u16), MorseError> {
52 match morse_character {
53 'A' => Ok((0b_00_0111_01, 8)),
54 'B' => Ok((0b_00_01_01_01_0111, 12)),
55 'C' => Ok((0b_00_01_0111_01_0111, 14)),
56 'D' => Ok((0b_00_01_01_0111, 10)),
57 'E' => Ok((0b_00_01, 4)),
58 'F' => Ok((0b_00_01_0111_01_01, 12)),
59 'G' => Ok((0b_00_01_0111_0111, 12)),
60 'H' => Ok((0b_00_01_01_01_01, 10)),
61 'I' => Ok((0b_00_01_01, 6)),
62 'J' => Ok((0b_00_0111_0111_0111_01, 16)),
63 'K' => Ok((0b_00_0111_01_0111, 12)),
64 'L' => Ok((0b_00_01_01_0111_01, 12)),
65 'M' => Ok((0b_00_0111_0111, 10)),
66 'N' => Ok((0b_00_01_0111, 8)),
67 'O' => Ok((0b_00_0111_0111_0111, 14)),
68 'P' => Ok((0b_00_01_0111_0111_01, 14)),
69 'Q' => Ok((0b_00_0111_01_0111_0111, 16)),
70 'R' => Ok((0b_00_01_0111_01, 10)),
71 'S' => Ok((0b_00_01_01_01, 8)),
72 'T' => Ok((0b_00_0111, 6)),
73 'U' => Ok((0b_00_0111_01_01, 10)),
74 'V' => Ok((0b_00_0111_01_01_01, 12)),
75 'W' => Ok((0b_00_0111_0111_01, 12)),
76 'X' => Ok((0b_00_0111_01_01_0111, 14)),
77 'Y' => Ok((0b_00_0111_0111_01_0111, 16)),
78 'Z' => Ok((0b_00_01_01_0111_0111, 14)),
79 ' ' => Ok((0b_00_00, 4)),
80 '1' => Ok((0b_00_0111_0111_0111_0111_01, 20)),
81 '2' => Ok((0b_00_0111_0111_0111_01_01, 18)),
82 '3' => Ok((0b_00_0111_0111_01_01_01, 16)),
83 '4' => Ok((0b_00_0111_01_01_01_01, 14)),
84 '5' => Ok((0b_00_01_01_01_01_01, 12)),
85 '6' => Ok((0b_00_01_01_01_01_0111, 14)),
86 '7' => Ok((0b_00_01_01_01_0111_0111, 16)),
87 '8' => Ok((0b_00_01_01_0111_0111_0111, 18)),
88 '9' => Ok((0b_00_01_0111_0111_0111_0111, 20)),
89 '0' => Ok((0b_00_0111_0111_0111_0111_0111, 22)),
90 _ => Err(MorseError::UnsupportedCode),
91 }
92}
93
94#[cfg(test)]
95mod tests;