use ppoppo_sdk_core::token_cache::TokenCacheError;
use tonic::Code;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("transport error: {0}")]
Transport(String),
#[error("token refresh failed: {0}")]
TokenRefresh(#[from] TokenCacheError),
#[error("invalid path prefix '{prefix}': {reason}")]
InvalidPathPrefix { prefix: String, reason: String },
#[error("rejected by PCS: {code:?} {message}")]
Rejected { code: Code, message: String },
#[error("PCS server error: {code:?} {message}")]
ServerError { code: Code, message: String },
#[error("unexpected proto response: {0}")]
ProtoMismatch(String),
}
#[must_use]
pub(crate) fn classify_status(status: &tonic::Status) -> Error {
let code = status.code();
let message = status.message().to_string();
match code {
Code::InvalidArgument
| Code::NotFound
| Code::AlreadyExists
| Code::PermissionDenied
| Code::Unauthenticated
| Code::ResourceExhausted
| Code::FailedPrecondition
| Code::OutOfRange
| Code::Aborted
| Code::Cancelled => Error::Rejected { code, message },
Code::Internal | Code::Unknown | Code::DataLoss | Code::Unimplemented => {
Error::ServerError { code, message }
}
Code::DeadlineExceeded => Error::ServerError { code, message },
Code::Unavailable => Error::Transport(message),
Code::Ok => Error::Transport(format!("classify_status called on Code::Ok: {message}")),
}
}