xdoc-rs 0.1.1

Declarative XML engine for Rust
Documentation
use base64::Engine;

use crate::core::{ErrorKind, XmlError, XmlResult};

/// Encodes bytes using the standard Base64 alphabet with padding.
pub fn encode_standard_base64(input: impl AsRef<[u8]>) -> String {
    base64::engine::general_purpose::STANDARD.encode(input)
}

/// Decodes standard Base64 data.
pub fn decode_standard_base64(input: &str) -> XmlResult<Vec<u8>> {
    base64::engine::general_purpose::STANDARD
        .decode(input)
        .map_err(|error| {
            XmlError::new(
                ErrorKind::Signature,
                format!("invalid standard base64 data: {error}"),
            )
        })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn signature_base64_encodes_standard_padded_values() {
        assert_eq!(encode_standard_base64("xdoc"), "eGRvYw==");
        assert_eq!(
            encode_standard_base64([0_u8, 1, 2, 253, 254, 255]),
            "AAEC/f7/"
        );
    }

    #[test]
    fn signature_base64_decodes_standard_padded_values() {
        assert_eq!(
            decode_standard_base64("eGRvYw==").expect("valid base64"),
            b"xdoc"
        );
    }

    #[test]
    fn signature_base64_rejects_invalid_input() {
        let error = decode_standard_base64("not base64!").expect_err("invalid base64 must fail");

        assert_eq!(error.kind(), &ErrorKind::Signature);
    }
}