regy 0.1.0

Private-by-default desktop agent for the Regy web interface
use base64::Engine;
use base64::engine::general_purpose::STANDARD;

use crate::domain::errors::{AgentError, AgentResult, ErrorCode};

pub fn encode_base64(bytes: &[u8]) -> String {
    STANDARD.encode(bytes)
}

pub fn decode_base64(input: &str) -> AgentResult<Vec<u8>> {
    STANDARD
        .decode(input)
        .map_err(|err| AgentError::new(ErrorCode::InvalidMessage, err.to_string()))
}

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

    #[test]
    fn encodes_and_decodes_raw_terminal_bytes() {
        let bytes = b"\x1b[31mhello\r\n";
        let encoded = encode_base64(bytes);
        assert_eq!(encoded, "G1szMW1oZWxsbw0K");
        assert_eq!(decode_base64(&encoded).unwrap(), bytes);
    }

    #[test]
    fn rejects_invalid_base64() {
        let err = decode_base64("%%%").unwrap_err();
        assert_eq!(err.code(), ErrorCode::InvalidMessage);
    }
}