use thiserror::Error;
use nodedb_types::Surrogate;
use crate::search::query_parser::InvalidQuery;
use nodedb_mem::MemError;
pub const MAX_INDEXABLE_SURROGATE: u32 = u32::MAX - 1;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum FtsIndexError<E: std::fmt::Display> {
#[error(
"surrogate {surrogate} is out of the indexable range \
1..={MAX_INDEXABLE_SURROGATE}; \
the zero value is the unassigned sentinel and u32::MAX is reserved"
)]
SurrogateOutOfRange { surrogate: Surrogate },
#[error("term length {len} exceeds maximum {max} bytes (FTS segment format limit)")]
TermTooLong { len: usize, max: usize },
#[error("invalid FTS query: {0}")]
InvalidQuery(#[from] InvalidQuery),
#[error("FTS backend error: {0}")]
Backend(E),
#[error("FTS segment error: {0}")]
Segment(crate::lsm::segment::error::SegmentError),
#[error("FTS memory budget exhausted: {0}")]
BudgetExhausted(MemError),
}
impl<E: std::fmt::Display> From<crate::lsm::segment::error::SegmentError> for FtsIndexError<E> {
fn from(err: crate::lsm::segment::error::SegmentError) -> Self {
use crate::lsm::segment::error::SegmentError;
match err {
SegmentError::TermTooLong { term_len, max } => {
FtsIndexError::TermTooLong { len: term_len, max }
}
other => FtsIndexError::Segment(other),
}
}
}
impl<E: std::fmt::Display> FtsIndexError<E> {
pub(crate) fn backend(e: E) -> Self {
Self::Backend(e)
}
}
impl<E: std::fmt::Display> From<MemError> for FtsIndexError<E> {
fn from(e: MemError) -> Self {
Self::BudgetExhausted(e)
}
}