sfo_cmd_server/
peer_id.rs1use 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}