matc/
onboarding.rs

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}