enigma/reflector/
from_args.rs

1use crate::enigma_int::ToEnigmaInt;
2
3use super::Reflector;
4
5impl Reflector {
6    pub fn from_args(argument: &String) -> Reflector {
7        let pairs = argument.split_whitespace();
8        if pairs.clone().count() != 13 {
9            panic!("Reflector must have 13 pairs of letters.\n --reflector \"PAIRS\"");
10        }
11
12        let mut wiring = [0; 26];
13
14        for pair in pairs {
15            let mut chars = pair.chars();
16            let first = chars.next().unwrap();
17            let second = chars.next().unwrap();
18
19            if !first.is_ascii_alphabetic() || !second.is_ascii_alphabetic() {
20                panic!("{} is invalid. Reflector pairs must be letters.", pair);
21            }
22
23            let first_int = first.to_internal_int();
24            let second_int = second.to_internal_int();
25
26            if wiring[first_int] != 0 || wiring[second_int] != 0 || first_int == second_int {
27                panic!("Reflector pairs must not have duplicate letters.");
28            }
29
30            wiring[first_int] = second_int;
31            wiring[second_int] = first_int;
32        }
33
34        Reflector { wiring }
35    }
36}