sfo_cmd_server/
peer_id.rs

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