use bytes::{Bytes, BytesMut};
use super::codec::KeyEncoder;
use super::error::KeyLabelError;
use super::{namespace::KeyNamespace, prefix::KeyPrefix};
pub const TENANT_METADATA_NAMESPACE: &str = "__meta";
const TENANT_METADATA_VERSION_PREFIX: &str = "v1";
const SCHEMA_VERSION_KEY: &str = "schema_version";
const CREATED_AT_KEY: &str = "created_at";
pub struct TenantMetadataSchemaVersionKey {
namespace: KeyNamespace,
prefix: KeyPrefix,
}
pub struct TenantMetadataCreatedAtKey {
namespace: KeyNamespace,
prefix: KeyPrefix,
}
pub struct TenantMetadataVersionPrefix;
impl TenantMetadataVersionPrefix {
pub fn components() -> Result<(KeyNamespace, KeyPrefix), KeyLabelError> {
Ok((
KeyNamespace::from_static(TENANT_METADATA_NAMESPACE)?,
KeyPrefix::from_static(TENANT_METADATA_VERSION_PREFIX)?,
))
}
}
impl TenantMetadataSchemaVersionKey {
pub fn new() -> Result<Self, KeyLabelError> {
let (namespace, prefix) = TenantMetadataVersionPrefix::components()?;
Ok(Self { namespace, prefix })
}
}
impl TenantMetadataCreatedAtKey {
pub fn new() -> Result<Self, KeyLabelError> {
let (namespace, prefix) = TenantMetadataVersionPrefix::components()?;
Ok(Self { namespace, prefix })
}
}
fn encode_key(namespace: &str, prefix: &str, key: &str) -> Bytes {
let mut bytes = BytesMut::with_capacity(
namespace
.len()
.checked_add(prefix.len())
.and_then(|value| value.checked_add(key.len()))
.and_then(|value| value.checked_add(2))
.unwrap_or(namespace.len()),
);
bytes.extend_from_slice(namespace.as_bytes());
bytes.extend_from_slice(b"/");
bytes.extend_from_slice(prefix.as_bytes());
bytes.extend_from_slice(b"/");
bytes.extend_from_slice(key.as_bytes());
bytes.freeze()
}
impl KeyEncoder for TenantMetadataSchemaVersionKey {
fn encode_key(&self) -> Bytes {
encode_key(
self.namespace.as_str(),
self.prefix.as_str(),
SCHEMA_VERSION_KEY,
)
}
}
impl KeyEncoder for TenantMetadataCreatedAtKey {
fn encode_key(&self) -> Bytes {
encode_key(
self.namespace.as_str(),
self.prefix.as_str(),
CREATED_AT_KEY,
)
}
}