use crate::compression::CompressionError;
use crate::frame::message_error::ErrorBody;
use crate::frame::Opcode;
use crate::types::{CInt, CIntShort};
use std::fmt::{Debug, Display};
use std::io;
use std::net::SocketAddr;
use std::result;
use std::str::Utf8Error;
use std::string::FromUtf8Error;
use thiserror::Error as ThisError;
use uuid::Error as UuidError;
pub type Result<T> = result::Result<T, Error>;
#[derive(Debug, ThisError)]
pub enum Error {
#[error("IO error: {0}")]
Io(#[from] io::Error),
#[error("Uuid parse error: {0}")]
UuidParse(#[from] UuidError),
#[error("General error: {0}")]
General(String),
#[error("FromUtf8 error: {0}")]
FromUtf8(#[from] FromUtf8Error),
#[error("Utf8 error: {0}")]
Utf8(#[from] Utf8Error),
#[error("Compressor error: {0}")]
Compression(#[from] CompressionError),
#[error("Server {addr} error: {body:?}")]
Server { body: ErrorBody, addr: SocketAddr },
#[error("Timeout: {0}")]
Timeout(String),
#[error("Unknown consistency: {0}")]
UnknownConsistency(CIntShort),
#[error("Unknown server event: {0}")]
UnknownServerEvent(String),
#[error("Unexpected topology change type: {0}")]
UnexpectedTopologyChangeType(String),
#[error("Unexpected status change type: {0}")]
UnexpectedStatusChangeType(String),
#[error("Unexpected schema change type: {0}")]
UnexpectedSchemaChangeType(String),
#[error("Unexpected schema change target: {0}")]
UnexpectedSchemaChangeTarget(String),
#[error("Unexpected additional error info: {0}")]
UnexpectedAdditionalErrorInfo(CInt),
#[error("Unexpected write type: {0}")]
UnexpectedWriteType(String),
#[error("Opcode is not a request: {0}")]
NonRequestOpcode(Opcode),
#[error("Opcode is not a response: {0}")]
NonResponseOpcode(Opcode),
#[error("Unexpected result kind: {0}")]
UnexpectedResultKind(CInt),
#[error("Unexpected column type: {0}")]
UnexpectedColumnType(CIntShort),
#[error("Invalid replication format for: {keyspace}")]
InvalidReplicationFormat { keyspace: String },
#[error("Unexpected auth response: {0}")]
UnexpectedAuthResponse(Opcode),
#[error("Unexpected startup response: {0}")]
UnexpectedStartupResponse(Opcode),
}
pub fn column_is_empty_err<T: Display>(column_name: T) -> Error {
Error::General(format!("Column or Udt property '{}' is empty", column_name))
}
impl From<String> for Error {
fn from(err: String) -> Error {
Error::General(err)
}
}
impl From<&str> for Error {
fn from(err: &str) -> Error {
Error::General(err.to_string())
}
}
impl Clone for Error {
fn clone(&self) -> Self {
match self {
Error::Io(error) => Error::Io(io::Error::new(
error.kind(),
error
.get_ref()
.map(|error| error.to_string())
.unwrap_or_default(),
)),
Error::UuidParse(error) => Error::UuidParse(error.clone()),
Error::General(error) => Error::General(error.clone()),
Error::FromUtf8(error) => Error::FromUtf8(error.clone()),
Error::Utf8(error) => Error::Utf8(*error),
Error::Compression(error) => Error::Compression(error.clone()),
Error::Server { body, addr } => Error::Server {
body: body.clone(),
addr: *addr,
},
Error::Timeout(error) => Error::Timeout(error.clone()),
Error::UnknownConsistency(value) => Error::UnknownConsistency(*value),
Error::UnknownServerEvent(value) => Error::UnknownServerEvent(value.clone()),
Error::UnexpectedTopologyChangeType(value) => {
Error::UnexpectedTopologyChangeType(value.clone())
}
Error::UnexpectedStatusChangeType(value) => {
Error::UnexpectedStatusChangeType(value.clone())
}
Error::UnexpectedSchemaChangeType(value) => {
Error::UnexpectedSchemaChangeType(value.clone())
}
Error::UnexpectedSchemaChangeTarget(value) => {
Error::UnexpectedSchemaChangeTarget(value.clone())
}
Error::UnexpectedAdditionalErrorInfo(value) => {
Error::UnexpectedAdditionalErrorInfo(*value)
}
Error::UnexpectedWriteType(value) => Error::UnexpectedWriteType(value.clone()),
Error::NonRequestOpcode(value) => Error::NonRequestOpcode(*value),
Error::NonResponseOpcode(value) => Error::NonResponseOpcode(*value),
Error::UnexpectedResultKind(value) => Error::UnexpectedResultKind(*value),
Error::UnexpectedColumnType(value) => Error::UnexpectedColumnType(*value),
Error::InvalidReplicationFormat { keyspace } => Error::InvalidReplicationFormat {
keyspace: keyspace.clone(),
},
Error::UnexpectedAuthResponse(value) => Error::UnexpectedAuthResponse(*value),
Error::UnexpectedStartupResponse(value) => Error::UnexpectedStartupResponse(*value),
}
}
}