use kimberlite_kernel::KernelError;
use kimberlite_query::QueryError;
use kimberlite_storage::StorageError;
use kimberlite_store::StoreError;
use kimberlite_types::{Offset, StreamId, 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("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())
}
}