waves_rust/model/
base58string.rs1use crate::error::Result;
2use std::fmt;
3use std::fmt::{Display, Formatter};
4
5pub trait ByteString {
6 fn bytes(&self) -> Vec<u8>;
7 fn encoded(&self) -> String;
8 fn encoded_with_prefix(&self) -> String;
9}
10
11#[derive(Clone, Eq, PartialEq, Hash)]
12pub struct Base58String {
13 bytes: Vec<u8>,
14}
15
16impl fmt::Debug for Base58String {
17 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
18 write!(f, "Base58String {{ {} }}", self.encoded())
19 }
20}
21
22impl Base58String {
23 pub fn from_bytes(bytes: Vec<u8>) -> Base58String {
24 Base58String { bytes }
25 }
26
27 pub fn from_string(encoded: &str) -> Result<Base58String> {
28 let bytes: Vec<u8> = bs58::decode(encoded).into_vec()?;
29 Ok(Base58String { bytes })
30 }
31
32 pub fn empty() -> Base58String {
33 Base58String { bytes: vec![] }
34 }
35}
36
37impl ByteString for Base58String {
38 fn bytes(&self) -> Vec<u8> {
39 self.bytes.clone()
40 }
41
42 fn encoded(&self) -> String {
43 bs58::encode(&self.bytes).into_string()
44 }
45
46 fn encoded_with_prefix(&self) -> String {
47 format!("base58:{}", bs58::encode(&self.bytes).into_string())
48 }
49}
50
51impl Display for Base58String {
52 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
53 write!(f, "{}", self.encoded())
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use crate::model::base58string::ByteString;
60 use crate::model::Base58String;
61
62 #[test]
63 fn test_base58string_from_string() {
64 let base58string =
65 Base58String::from_string("7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
66 .expect("failed to get base58string from string");
67
68 assert_eq!(
69 base58string.encoded(),
70 "7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2"
71 );
72 assert_eq!(
73 base58string.encoded_with_prefix(),
74 "base58:7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2"
75 )
76 }
77
78 #[test]
79 fn test_base58string_from_bytes() {
80 let bytes = bs58::decode("7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
81 .into_vec()
82 .expect("Failed to parse base58 string");
83 let base58string = Base58String::from_bytes(bytes);
84
85 assert_eq!(
86 base58string.encoded(),
87 "7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2"
88 );
89 assert_eq!(
90 base58string.encoded_with_prefix(),
91 "base58:7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2"
92 )
93 }
94
95 #[test]
96 fn test_eq_between_base58_strings() {
97 let bytes = bs58::decode("7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
98 .into_vec()
99 .expect("Failed to parse base58 string");
100 let base58string1 = Base58String::from_bytes(bytes);
101
102 let base58string2 =
103 Base58String::from_string("7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
104 .expect("failed to get base58string from string");
105
106 let base58string3 =
107 Base58String::from_string("8LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
108 .expect("failed to get base58string from string");
109
110 assert_eq!(base58string1 == base58string2, true);
111 assert_eq!(base58string2 == base58string3, false)
112 }
113
114 #[test]
115 fn test_pretty_print() {
116 let base58string =
117 Base58String::from_string("7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2")
118 .expect("failed to get base58string from string");
119 let formatted_string = format!("{}", base58string);
120 assert_eq!(
121 "7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2",
122 formatted_string
123 )
124 }
125}