radicle: Switch error type for repository methods

This simplifies error handling for the next commit.
This commit is contained in:
cloudhead 2024-03-29 15:48:01 +01:00
parent 2b9a014243
commit 991505ec9d
No known key found for this signature in database
5 changed files with 32 additions and 14 deletions

View File

@ -129,6 +129,9 @@ impl IntoResponse for Error {
Error::Storage(err) if err.is_not_found() => { Error::Storage(err) if err.is_not_found() => {
(StatusCode::NOT_FOUND, Some(err.to_string())) (StatusCode::NOT_FOUND, Some(err.to_string()))
} }
Error::Repository(err) if err.is_not_found() => {
(StatusCode::NOT_FOUND, Some(err.to_string()))
}
Error::StorageRef(err) if err.is_not_found() => { Error::StorageRef(err) if err.is_not_found() => {
(StatusCode::NOT_FOUND, Some(err.to_string())) (StatusCode::NOT_FOUND, Some(err.to_string()))
} }

View File

@ -54,9 +54,9 @@ pub enum Error {
/// Invalid reference name. /// Invalid reference name.
#[error("invalid ref: {0}")] #[error("invalid ref: {0}")]
InvalidRef(#[from] radicle::git::fmt::Error), InvalidRef(#[from] radicle::git::fmt::Error),
/// Storage error. /// Repository error.
#[error(transparent)] #[error(transparent)]
Storage(#[from] radicle::storage::Error), Repository(#[from] radicle::storage::RepositoryError),
/// Fetch error. /// Fetch error.
#[error(transparent)] #[error(transparent)]
Fetch(#[from] fetch::Error), Fetch(#[from] fetch::Error),

View File

@ -105,6 +105,17 @@ pub enum RepositoryError {
Refs(#[from] refs::Error), Refs(#[from] refs::Error),
} }
impl RepositoryError {
pub fn is_not_found(&self) -> bool {
match self {
Self::Storage(e) if e.is_not_found() => true,
Self::Git(e) if git_ext::is_not_found_err(e) => true,
Self::GitExt(git_ext::Error::NotFound(_)) => true,
_ => false,
}
}
}
/// Storage error. /// Storage error.
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
@ -377,7 +388,7 @@ pub trait ReadStorage {
/// Insert this repository into the inventory. /// Insert this repository into the inventory.
fn insert(&self, rid: RepoId); fn insert(&self, rid: RepoId);
/// Open or create a read-only repository. /// Open or create a read-only repository.
fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error>; fn repository(&self, rid: RepoId) -> Result<Self::Repository, RepositoryError>;
/// Get a repository's identity if it exists. /// Get a repository's identity if it exists.
fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError> { fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError> {
match self.repository(rid) { match self.repository(rid) {
@ -393,7 +404,7 @@ pub trait WriteStorage: ReadStorage {
type RepositoryMut: WriteRepository; type RepositoryMut: WriteRepository;
/// Open a read-write repository. /// Open a read-write repository.
fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error>; fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, RepositoryError>;
/// Create a read-write repository. /// Create a read-write repository.
fn create(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error>; fn create(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error>;
@ -642,7 +653,7 @@ where
self.deref().get(rid) self.deref().get(rid)
} }
fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, RepositoryError> {
self.deref().repository(rid) self.deref().repository(rid)
} }
} }
@ -654,7 +665,7 @@ where
{ {
type RepositoryMut = S::RepositoryMut; type RepositoryMut = S::RepositoryMut;
fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, RepositoryError> {
self.deref().repository_mut(rid) self.deref().repository_mut(rid)
} }

View File

@ -145,7 +145,7 @@ impl ReadStorage for Storage {
} }
} }
fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, RepositoryError> {
Repository::open(paths::repository(self, &rid), rid) Repository::open(paths::repository(self, &rid), rid)
} }
} }
@ -153,7 +153,7 @@ impl ReadStorage for Storage {
impl WriteStorage for Storage { impl WriteStorage for Storage {
type RepositoryMut = Repository; type RepositoryMut = Repository;
fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, RepositoryError> {
Repository::open(paths::repository(self, &rid), rid) Repository::open(paths::repository(self, &rid), rid)
} }
@ -295,7 +295,7 @@ impl Storage {
}) })
} }
pub fn inspect(&self) -> Result<(), Error> { pub fn inspect(&self) -> Result<(), RepositoryError> {
for r in self.repositories()? { for r in self.repositories()? {
let rid = r.rid; let rid = r.rid;
let repo = self.repository(rid)?; let repo = self.repository(rid)?;
@ -386,7 +386,7 @@ pub enum Validation {
impl Repository { impl Repository {
/// Open an existing repository. /// Open an existing repository.
pub fn open<P: AsRef<Path>>(path: P, id: RepoId) -> Result<Self, Error> { pub fn open<P: AsRef<Path>>(path: P, id: RepoId) -> Result<Self, RepositoryError> {
let backend = git2::Repository::open_bare(path.as_ref())?; let backend = git2::Repository::open_bare(path.as_ref())?;
Ok(Self { id, backend }) Ok(Self { id, backend })

View File

@ -81,10 +81,12 @@ impl ReadStorage for MockStorage {
fn insert(&self, _rid: RepoId) {} fn insert(&self, _rid: RepoId) {}
fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, RepositoryError> {
self.repos self.repos
.get(&rid) .get(&rid)
.ok_or_else(|| Error::Io(io::Error::from(io::ErrorKind::NotFound))) .ok_or_else(|| {
RepositoryError::Storage(Error::Io(io::Error::from(io::ErrorKind::NotFound)))
})
.cloned() .cloned()
} }
} }
@ -92,10 +94,12 @@ impl ReadStorage for MockStorage {
impl WriteStorage for MockStorage { impl WriteStorage for MockStorage {
type RepositoryMut = MockRepository; type RepositoryMut = MockRepository;
fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, RepositoryError> {
self.repos self.repos
.get(&rid) .get(&rid)
.ok_or(Error::Io(io::ErrorKind::NotFound.into())) .ok_or(RepositoryError::Storage(Error::Io(io::Error::from(
io::ErrorKind::NotFound,
))))
.cloned() .cloned()
} }