1use anyhow::Result;
2
3#[derive(Debug)]
4pub struct OnboardingInfo {
5 pub discriminator: u16,
6 pub passcode: u32,
7}
8
9pub fn decode_manual_pairing_code(code: &str) -> Result<OnboardingInfo> {
10 let norm = code.replace("-", "");
11 let first_grp = &norm[0..1];
12 let second_grp = &norm[1..6];
13 let third_grp = &norm[6..10];
14 let first = first_grp.parse::<u32>()?;
15 let second = second_grp.parse::<u32>()?;
16 let third = third_grp.parse::<u32>()?;
17 let passcode = second & 0x3fff | (third << 14);
18 let discriminator = (((first & 3) << 10) | (second >> 6) & 0x300) as u16;
19 Ok(OnboardingInfo {
20 discriminator,
21 passcode,
22 })
23}
24
25#[cfg(test)]
26mod tests {
27 use super::decode_manual_pairing_code;
28
29 #[test]
30 pub fn test_1() {
31 let res = decode_manual_pairing_code("2585-103-3238").unwrap();
32 assert_eq!(res.discriminator, 2816);
33 assert_eq!(res.passcode, 54453390);
34 }
35
36 #[test]
37 pub fn test_2() {
38 let res = decode_manual_pairing_code("34970112332").unwrap();
39 assert_eq!(res.discriminator, 3840);
40 assert_eq!(res.passcode, 20202021);
41 }
42}