pub fn format_sys_from(sys_from_ms: i64) -> String {
format!("{sys_from_ms:020}")
}
pub fn versioned_doc_key(
tenant: u64,
coll: &str,
doc_id: &str,
sys_from_ms: i64,
) -> crate::Result<String> {
if doc_id.as_bytes().contains(&0) {
return Err(crate::Error::BadRequest {
detail: "document id may not contain NUL byte".into(),
});
}
Ok(format!(
"{tenant}:{coll}:{doc_id}\x00{}",
format_sys_from(sys_from_ms)
))
}
pub fn doc_prefix(tenant: u64, coll: &str, doc_id: &str) -> String {
format!("{tenant}:{coll}:{doc_id}\x00")
}
pub fn doc_prefix_end(tenant: u64, coll: &str, doc_id: &str) -> String {
format!("{tenant}:{coll}:{doc_id}\x01")
}
pub fn coll_prefix(tenant: u64, coll: &str) -> String {
format!("{tenant}:{coll}:")
}
pub fn coll_prefix_end(tenant: u64, coll: &str) -> String {
format!("{tenant}:{coll};")
}
pub fn parse_sys_from(key: &str) -> Option<i64> {
let (_, suffix) = key.rsplit_once('\x00')?;
suffix.parse().ok()
}
pub fn parse_doc_id<'a>(key: &'a str, tenant: u64, coll: &str) -> Option<&'a str> {
let prefix = format!("{tenant}:{coll}:");
let rest = key.strip_prefix(&prefix)?;
let (id, _) = rest.rsplit_once('\x00')?;
Some(id)
}