1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use crate::error::Result;

pub struct Base58;

impl Base58 {
    pub fn decode(source: &str) -> Result<Vec<u8>> {
        Ok(bs58::decode(source).into_vec()?)
    }

    pub fn encode(bytes: &Vec<u8>, with_prefix: bool) -> String {
        let base58string = bs58::encode(bytes).into_string();
        if with_prefix {
            return format!("base58:{}", base58string);
        }
        base58string
    }

    pub fn string_is_valid(encoded: &str) -> bool {
        bs58::decode(encoded).into_vec().is_ok()
    }
}

#[cfg(test)]
mod tests {
    use crate::util::Base58;

    #[test]
    fn test_valid_base58string() {
        let base58string = "7LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2";
        assert_eq!(Base58::string_is_valid(base58string), true);
    }

    #[test]
    fn test_invalid_base58string() {
        let empty_string = "";
        let invalid_string = "0LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2";
        assert_eq!(Base58::string_is_valid(empty_string), true);
        assert_eq!(Base58::string_is_valid(invalid_string), false);
    }

    #[test]
    fn test_decode_string() {
        let test_string = "1LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2";
        let bytes = Base58::decode(test_string).expect("failed to decode base58 from string");
        let base58string = Base58::encode(&bytes, false);
        let base58string_with_prefix = Base58::encode(&bytes, true);
        assert_eq!(test_string, base58string);
        assert_eq!(
            base58string_with_prefix,
            "base58:1LBopaBdBzQbgqrnwgmgCDhcSTb32MYhE96SnSHcqZC2"
        )
    }
}