use crate::codec::{CesrCodec, SigType};
use crate::error::KeriTranslationError;
use crate::event::SerializedEvent;
#[derive(Debug, Clone)]
pub struct AttachmentGroup {
pub controller_signatures: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct CesrStream {
pub bytes: Vec<u8>,
pub event_count: usize,
}
pub fn assemble_cesr_stream(
codec: &dyn CesrCodec,
events: &[SerializedEvent],
) -> Result<CesrStream, KeriTranslationError> {
let mut stream = Vec::new();
for event in events {
stream.extend_from_slice(&event.body_bytes);
if let Some(ref sig_bytes) = event.signature_bytes {
let cesr_sig = codec.encode_indexed_signature(
sig_bytes,
SigType::Ed25519,
event.signature_key_index,
)?;
let count_code = format!("-AA{}", cesr_count_char(1));
stream.extend_from_slice(count_code.as_bytes());
stream.extend_from_slice(cesr_sig.as_bytes());
}
}
Ok(CesrStream {
event_count: events.len(),
bytes: stream,
})
}
fn cesr_count_char(count: u8) -> char {
const BASE64URL: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
BASE64URL[count as usize] as char
}