sfo_cmd_server/
peer_id.rs

1use std::fmt::{Debug, Display, Formatter};
2use base58::{FromBase58, ToBase58};
3use crate::errors::{cmd_err, CmdError, CmdErrorCode, CmdResult};
4
5pub trait ToBase36 {
6    fn to_base36(&self) -> String;
7}
8
9pub trait FromBase36 {
10    fn from_base36(&self) -> CmdResult<Vec<u8>>;
11}
12
13const ALPHABET: &[u8] = b"0123456789abcdefghijklmnopqrstuvwxyz";
14
15impl ToBase36 for [u8] {
16    fn to_base36(&self) -> String {
17        base_x::encode(ALPHABET, self)
18    }
19}
20
21impl FromBase36 for str {
22    fn from_base36(&self) -> CmdResult<Vec<u8>> {
23        base_x::decode(ALPHABET, &self.to_ascii_lowercase()).map_err(|e| {
24            let msg = format!("convert string to base36 error! {self}, {e}");
25            CmdError::new(CmdErrorCode::Failed, msg)
26        })
27    }
28}
29
30#[derive(Clone, Eq, PartialEq, Hash)]
31pub struct PeerId(Vec<u8>);
32impl PeerId {
33    pub fn to_base58(&self) -> String {
34        self.0.as_slice().to_base58()
35    }
36
37    pub fn from_base58(base58: &str) -> CmdResult<Self> {
38        Ok(Self(base58.from_base58().map_err(|_| cmd_err!(CmdErrorCode::InvalidParam, "invalid peer id {}", base58))?))
39    }
40
41    pub fn as_slice(&self) -> &[u8] {
42        self.0.as_slice()
43    }
44
45    pub fn to_base36(&self) -> String {
46        self.0.to_base36()
47    }
48
49    pub fn from_base36(base36: &str) -> CmdResult<Self> {
50        Ok(Self(base36.from_base36()?))
51    }
52}
53
54impl Display for PeerId {
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56        write!(f, "{}", self.to_base36())
57    }
58}
59
60impl Debug for PeerId {
61    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
62        write!(f, "{}", self.to_base36())
63    }
64}
65
66impl From<&[u8]> for PeerId {
67    fn from(key: &[u8]) -> Self {
68        Self(key.to_vec())
69    }
70}
71
72impl From<Vec<u8>> for PeerId {
73    fn from(key: Vec<u8>) -> Self {
74        Self(key)
75    }
76}