use kimberlite_kernel::KernelError;
use kimberlite_query::QueryError;
use kimberlite_storage::StorageError;
use kimberlite_store::StoreError;
use kimberlite_types::{Offset, StreamId, StreamIdEncodingError, TenantId};
use thiserror::Error;
pub type Result<T> = std::result::Result<T, KimberliteError>;
#[derive(Debug, Error)]
pub enum KimberliteError {
#[error("kernel error: {0}")]
Kernel(#[from] KernelError),
#[error("storage error: {0}")]
Storage(#[from] StorageError),
#[error("store error: {0}")]
Store(#[from] StoreError),
#[error("query error: {0}")]
Query(#[from] QueryError),
#[error("tenant not found: {0:?}")]
TenantNotFound(TenantId),
#[error(
"tenant_id {tenant_id} exceeds the StreamId encoding limit of {max}; tenant ids must be <= u32::MAX. \
Reduce tenant_id below {max} (see kimberlite_types::MAX_TENANT_ID_FOR_STREAM_ID)."
)]
TenantIdTooLarge { tenant_id: u64, max: u64 },
#[error("stream not found: {0}")]
StreamNotFound(StreamId),
#[error("table not found: {0}")]
TableNotFound(String),
#[error("position {requested} is ahead of current log position {current}")]
PositionAhead { requested: Offset, current: Offset },
#[error("configuration error: {0}")]
Config(String),
#[error("i/o error: {0}")]
Io(#[from] std::io::Error),
#[error("projection store at position {store_pos}, log at {log_pos}")]
ProjectionLag { store_pos: Offset, log_pos: Offset },
#[error("internal error: {0}")]
Internal(String),
}
impl KimberliteError {
pub fn internal(msg: impl Into<String>) -> Self {
Self::Internal(msg.into())
}
pub fn config(msg: impl Into<String>) -> Self {
Self::Config(msg.into())
}
}
impl From<StreamIdEncodingError> for KimberliteError {
fn from(e: StreamIdEncodingError) -> Self {
match e {
StreamIdEncodingError::TenantIdTooLarge { tenant_id, max } => {
Self::TenantIdTooLarge { tenant_id, max }
}
}
}
}