#![allow(clippy::result_large_err)]
use gunnar_proto::RepoPath;
use tonic::Status;
use crate::seam::ControlError;
impl From<ControlError> for Status {
fn from(error: ControlError) -> Self {
let message = error.to_string();
match error {
ControlError::NotFound(_) => Status::not_found(message),
ControlError::AlreadyExists(_) => Status::already_exists(message),
ControlError::InvalidArgument(_) => Status::invalid_argument(message),
ControlError::FailedPrecondition(_) => Status::failed_precondition(message),
ControlError::ResourceExhausted(_) => Status::resource_exhausted(message),
ControlError::Unimplemented(_) => Status::unimplemented(message),
ControlError::Internal(_) => Status::internal(message),
ControlError::Unavailable(_) => Status::unavailable(message),
ControlError::Unauthenticated(_) => Status::unauthenticated(message),
ControlError::PermissionDenied(_) => Status::permission_denied(message),
}
}
}
pub(crate) fn require<T>(field: Option<T>, name: &str) -> Result<T, Status> {
field.ok_or_else(|| Status::invalid_argument(format!("`{name}` is required")))
}
pub(crate) fn repo_path(field: Option<RepoPath>, name: &str) -> Result<RepoPath, Status> {
let path = require(field, name)?;
path.validate()
.map_err(|e| Status::invalid_argument(format!("`{name}`: {e}")))?;
Ok(path)
}
pub(crate) fn opt_repo_path(
field: Option<RepoPath>,
name: &str,
) -> Result<Option<RepoPath>, Status> {
match field {
None => Ok(None),
Some(path) => {
path.validate()
.map_err(|e| Status::invalid_argument(format!("`{name}`: {e}")))?;
Ok(Some(path))
}
}
}
pub(crate) fn opt_str(value: &str) -> Option<&str> {
if value.is_empty() {
None
} else {
Some(value)
}
}