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