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
use clap::arg_enum; pub fn encode_data(encoding: Encoding, data: Vec<u8>) -> Vec<u8> { encoding.encoding().encode(data.as_slice()).into_bytes() } pub fn decode_data( encoding: Encoding, mut data: Vec<u8>, ) -> Result<Vec<u8>, data_encoding::DecodeError> { match encoding { Encoding::Hex => { if data.starts_with(&['0' as u8, 'x' as u8]) { data.remove(0); data.remove(0); } } _ => {} } encoding.encoding().decode(data.as_slice()) } arg_enum! { #[derive(Debug)] pub enum Encoding { Hex, Base32, Base32Hex, Base64, Base64Url, } } impl Encoding { fn encoding(&self) -> data_encoding::Encoding { match self { Encoding::Hex => data_encoding::HEXUPPER_PERMISSIVE, Encoding::Base32 => data_encoding::BASE32, Encoding::Base32Hex => data_encoding::BASE32HEX, Encoding::Base64 => data_encoding::BASE64, Encoding::Base64Url => data_encoding::BASE64URL, } } }