mod server_status;
mod status_code;
pub use status_code::StatusCodeError;
pub type StatusOr<T> = Result<T, StatusError>;
pub type Status = StatusOr<()>;
#[derive(Debug, Clone)]
pub struct StatusError {
code: StatusCodeError,
message: String,
}
impl StatusError {
pub fn new(code: StatusCodeError, message: impl Into<String>) -> Self {
StatusError {
code,
message: message.into(),
}
}
pub fn code(&self) -> StatusCodeError {
self.code
}
pub fn message(&self) -> &str {
&self.message
}
pub(crate) fn is_restricted_control_plane_code(&self) -> bool {
matches!(
self.code,
StatusCodeError::InvalidArgument
| StatusCodeError::NotFound
| StatusCodeError::AlreadyExists
| StatusCodeError::FailedPrecondition
| StatusCodeError::Aborted
| StatusCodeError::OutOfRange
| StatusCodeError::DataLoss
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_status_new() {
let status = StatusError::new(StatusCodeError::NotFound, "not ok");
assert_eq!(status.code(), StatusCodeError::NotFound);
assert_eq!(status.message(), "not ok");
}
#[test]
fn test_status_debug() {
let status = StatusError::new(StatusCodeError::Cancelled, "not ok");
let debug = format!("{:?}", status);
assert!(debug.contains("Status"));
assert!(debug.contains("Cancelled"));
assert!(debug.contains("not ok"));
}
}