use iceberg::{NamespaceIdent, TableIdent};
pub(crate) const SEP: char = '\x1f';
pub(crate) fn ns_path(ns: &NamespaceIdent) -> String {
ns.clone().inner().join(".")
}
pub(crate) fn namespace_key(catalog: &str, ns: &NamespaceIdent) -> String {
format!("{catalog}{SEP}{}", ns_path(ns))
}
pub(crate) fn namespace_prop_key(catalog: &str, ns: &NamespaceIdent, prop: &str) -> String {
format!("{catalog}{SEP}{}{SEP}{prop}", ns_path(ns))
}
pub(crate) fn namespace_prop_prefix(catalog: &str, ns: &NamespaceIdent) -> String {
format!("{catalog}{SEP}{}{SEP}", ns_path(ns))
}
pub(crate) fn table_key(catalog: &str, table: &TableIdent) -> String {
format!(
"{catalog}{SEP}{}{SEP}{}",
ns_path(table.namespace()),
table.name()
)
}
pub(crate) fn table_prefix(catalog: &str, ns: &NamespaceIdent) -> String {
format!("{catalog}{SEP}{}{SEP}", ns_path(ns))
}
pub(crate) fn catalog_prefix(catalog: &str) -> String {
format!("{catalog}{SEP}")
}
pub(crate) fn prefix_upper(prefix: &str) -> String {
let mut bytes = prefix.as_bytes().to_vec();
while let Some(last) = bytes.last_mut() {
if *last < 0xFF {
*last += 1;
return String::from_utf8(bytes).expect("prefix increment stays ASCII");
} else {
bytes.pop();
}
}
String::new()
}