platform_value/
string_encoding.rs

1use crate::Error;
2use base64;
3use base64::prelude::BASE64_STANDARD;
4use base64::Engine;
5use bs58;
6use std::fmt;
7
8#[derive(Debug, Copy, Clone)]
9pub enum Encoding {
10    Base58,
11    Base64,
12    Hex,
13}
14
15pub const ALL_ENCODINGS: [Encoding; 3] = [Encoding::Hex, Encoding::Base58, Encoding::Base64];
16
17impl fmt::Display for Encoding {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        match self {
20            Encoding::Base58 => write!(f, "Base58"),
21            Encoding::Base64 => write!(f, "Base64"),
22            Encoding::Hex => write!(f, "Hex"),
23        }
24    }
25}
26
27pub fn decode(encoded_value: &str, encoding: Encoding) -> Result<Vec<u8>, Error> {
28    match encoding {
29        Encoding::Base58 => Ok(bs58::decode(encoded_value)
30            .into_vec()
31            .map_err(|e| Error::StringDecodingError(e.to_string()))?),
32        Encoding::Base64 => Ok(BASE64_STANDARD
33            .decode(encoded_value)
34            .map_err(|e| Error::StringDecodingError(e.to_string()))?),
35        Encoding::Hex => Ok(
36            hex::decode(encoded_value).map_err(|e| Error::StringDecodingError(e.to_string()))?
37        ),
38    }
39}
40
41pub fn encode(value: &[u8], encoding: Encoding) -> String {
42    match encoding {
43        Encoding::Base58 => bs58::encode(value).into_string(),
44        Encoding::Base64 => BASE64_STANDARD.encode(value),
45        Encoding::Hex => hex::encode(value),
46    }
47}