#[derive(Debug)]
pub(super) enum CompatibleDocument<'a> {
WellFormed(&'a [u8]),
CleanedFromRing(Vec<u8>),
}
impl<'a> CompatibleDocument<'a> {
pub(super) fn from_bytes(bytes: &'a [u8]) -> Self {
if is_ring(bytes) {
Self::CleanedFromRing(fix_ring_doc(bytes.to_vec()))
} else {
Self::WellFormed(bytes)
}
}
}
const RING_TEMPLATE_CONTEXT_SPECIFIC: &[u8] = &[0xA1, 0x23, 0x03, 0x21];
const WELL_FORMED_CONTEXT_ONE_PREFIX: &[u8] = &[0x81, 0x21];
fn fix_ring_doc(mut doc: Vec<u8>) -> Vec<u8> {
assert!(!doc.is_empty());
assert_eq!(doc[0], 0x30);
assert_eq!(doc[1] as usize, doc.len() - 2);
let idx = memchr::memmem::find(&doc, RING_TEMPLATE_CONTEXT_SPECIFIC)
.expect("Expected to find ring template in doc, but found none.");
let suffix = doc.split_off(idx);
doc.extend(WELL_FORMED_CONTEXT_ONE_PREFIX);
doc.extend(&suffix[4..]);
doc[1] = doc.len() as u8 - 2;
doc
}
fn is_ring(bytes: &[u8]) -> bool {
memchr::memmem::find(bytes, RING_TEMPLATE_CONTEXT_SPECIFIC).is_some()
}