use base64::Engine; use base64::engine::GeneralPurpose; use base64::engine::general_purpose::STANDARD; use base64::engine::general_purpose::STANDARD_NO_PAD; pub struct Base64Encoder { payload_engine: GeneralPurpose, signature_engine: GeneralPurpose, public_key_engine: GeneralPurpose, secret_key_engine: GeneralPurpose, } impl Base64Encoder { pub(crate) fn b64_encode(&self, p0: &[u8]) -> String { self.payload_engine.encode(p0) } pub(crate) fn b64_decode(&self, p0: String) -> Result, base64::DecodeError> { self.payload_engine.decode(p0) } } pub const B64_ENCODER: &Base64Encoder = &Base64Encoder::new(); impl Base64Encoder { pub const fn new() -> Self { // Made new() a const fn Base64Encoder { payload_engine: STANDARD, signature_engine: STANDARD, public_key_engine: STANDARD, secret_key_engine: STANDARD, } } pub fn b64_encode_payload>(&self, input: T) -> String { // Added trait bound self.payload_engine.encode(input) } pub fn b64_decode_payload>(&self, input: T) -> Result, base64::DecodeError> { // Added trait bound self.payload_engine.decode(input) } pub fn b64_decode_signature>(&self, input: T) -> Result, base64::DecodeError> { // Added trait bound self.signature_engine.decode(input) } pub fn b64_encode_signature>(&self, input: T) -> String { // Added trait bound self.signature_engine.encode(input) } pub fn b64_encode_public_key>(&self, input: T) -> String { // Added trait bound self.public_key_engine.encode(input) } pub fn b64_decode_public_key>(&self, input: T) -> Result, base64::DecodeError> { // Added trait bound self.public_key_engine.decode(input) } pub fn b64_encode_secret_key>(&self, input: T) -> String { // Added trait bound self.secret_key_engine.encode(input) } pub fn b64_decode_secret_key>(&self, input: T) -> Result, base64::DecodeError> { // Added trait bound self.secret_key_engine.decode(input) } }