1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//! 私有内网ID

use crate::{Id, IdKind, ID_LEN};
#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;

#[cfg_attr(feature = "wasm", wasm_bindgen)]
#[derive(Debug, PartialEq)]
pub struct PrivateId {
    len: usize,
    buf: [u8; ID_LEN],
}
#[cfg_attr(feature = "wasm", wasm_bindgen)]
impl PrivateId {
    pub const fn new(sn: &[u8]) -> Self {
        let mut i_s = 0;
        while i_s < sn.len() && sn[i_s] == 0 {
            i_s += 1;
        }
        let sn_len = sn.len() - i_s;

        let mut buf = [0; ID_LEN];
        buf[0] = 0x00 | sn_len as u8;
        let mut i = 0;
        while i < sn_len {
            buf[1 + i] = sn[i_s + i];
            i += 1;
        }
        return PrivateId {
            len: 1 + sn_len,
            buf,
        };
    }
    pub const fn id(&self) -> Id {
        Id {
            len: self.len,
            buf: self.buf,
        }
    }
    pub fn try_from(id: &Id) -> Option<PrivateId> {
        if id.kind() != IdKind::Private {
            return None;
        }
        return Some(PrivateId {
            len: id.len,
            buf: id.buf,
        });
    }
}