use crate::namespace::control::{read_head_object, ControlObjectLoadError};
use loonfs_api::wire::control::HeadState;
use loonfs_api::{ContentStoreId, NamespaceId};
use loonfs_objectstore::ObjectStore;
use thiserror::Error;
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum NamespaceCatalogLoadError {
#[error("failed to load namespace head: {0}")]
LoadHead(#[from] ControlObjectLoadError),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VerifiedNamespaceCatalogEntry {
namespace_id: NamespaceId,
content_store_id: ContentStoreId,
}
impl VerifiedNamespaceCatalogEntry {
pub fn from_head(head: &HeadState) -> Self {
Self {
namespace_id: head.namespace_id.clone(),
content_store_id: head.content_store_id.clone(),
}
}
pub fn namespace_id(&self) -> &NamespaceId {
&self.namespace_id
}
pub fn content_store_id(&self) -> &ContentStoreId {
&self.content_store_id
}
}
pub async fn load_namespace_catalog_entry<S: ObjectStore + ?Sized>(
store: &S,
expected_namespace_id: &NamespaceId,
) -> Result<VerifiedNamespaceCatalogEntry, NamespaceCatalogLoadError> {
let head = read_head_object(store, expected_namespace_id).await?;
Ok(VerifiedNamespaceCatalogEntry::from_head(
&head.envelope.state,
))
}
pub(crate) async fn load_namespace_content_store_id<S: ObjectStore + ?Sized>(
store: &S,
expected_namespace_id: &NamespaceId,
) -> Result<ContentStoreId, NamespaceCatalogLoadError> {
Ok(load_namespace_catalog_entry(store, expected_namespace_id)
.await?
.content_store_id)
}