use std::result;
use thiserror::Error;
#[derive(Debug, Error)]
#[allow(clippy::large_enum_variant)]
pub enum Error {
#[error("Unimplemented feature")]
Unimplemented,
#[error("Duplicate key insertion")]
DuplicateKeyInsertion,
#[error("Failed to resolve lock")]
ResolveLockError,
#[error("Invalid operation for this type of transaction")]
InvalidTransactionType,
#[error("Cannot read or write data after any attempt to commit or roll back the transaction")]
OperationAfterCommitError,
#[error("1PC transaction could not be committed.")]
OnePcFailure,
#[error("transaction has no primary key")]
NoPrimaryKey,
#[error(
"The operation is not supported in current mode, please consider using RawClient with or without atomic mode"
)]
UnsupportedMode,
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("gRPC error: {0}")]
Grpc(#[from] grpcio::Error),
#[error("A futures oneshot channel was canceled. {0}")]
Canceled(#[from] futures::channel::oneshot::Canceled),
#[error("Region error: {0:?}")]
RegionError(tikv_client_proto::errorpb::Error),
#[error("Whether the transaction is committed or not is undetermined")]
UndeterminedError(Box<Error>),
#[error("{0:?}")]
KeyError(tikv_client_proto::kvrpcpb::KeyError),
#[error("Multiple errors: {0:?}")]
MultipleErrors(Vec<Error>),
#[error("Unsupported column family {}", _0)]
ColumnFamilyError(String),
#[error("Region is not found for key: {:?}", key)]
RegionForKeyNotFound { key: Vec<u8> },
#[error("Region {} is not found", region_id)]
RegionNotFound { region_id: u64 },
#[error("Leader of region {} is not found", region_id)]
LeaderNotFound { region_id: u64 },
#[error("Limit {} exceeds max scan limit {}", limit, max_limit)]
MaxScanLimitExceeded { limit: u32, max_limit: u32 },
#[error("Kv error. {}", message)]
KvError { message: String },
#[error("{}", message)]
InternalError { message: String },
#[error("{0}")]
StringError(String),
}
impl From<tikv_client_proto::errorpb::Error> for Error {
fn from(e: tikv_client_proto::errorpb::Error) -> Error {
Error::RegionError(e)
}
}
impl From<tikv_client_proto::kvrpcpb::KeyError> for Error {
fn from(e: tikv_client_proto::kvrpcpb::KeyError) -> Error {
Error::KeyError(e)
}
}
pub type Result<T> = result::Result<T, Error>;
#[macro_export]
macro_rules! internal_err {
($e:expr) => ({
$crate::Error::InternalError {
message: format!("[{}:{}]: {}", file!(), line!(), $e)
}
});
($f:tt, $($arg:expr),+) => ({
internal_err!(format!($f, $($arg),+))
});
}