use std::fmt::{self, Display, Formatter};
pub type RqsResult<T> = Result<T, RqsError>;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum RqsError {
QueryTooLarge {
max_bytes: usize,
},
TooManyParameters {
max_parameters: usize,
},
InvalidEncoding,
InvalidFieldName {
field: String,
},
InvalidColumnName {
column: String,
},
UnknownField {
field: String,
},
InvalidOperator,
MissingValue {
field: String,
},
InvalidValue {
field: String,
expected: &'static str,
},
ValueTooLarge {
field: String,
max_bytes: usize,
},
TooManyListItems {
field: String,
max_items: usize,
},
InvalidPagination {
parameter: &'static str,
},
NegativePagination {
parameter: &'static str,
},
LimitTooLarge {
max_limit: u64,
},
RegexDisabled {
field: String,
},
TextSearchUnsupported,
DuplicateFilter {
field: String,
operator: &'static str,
},
AdapterUnsupported {
feature: &'static str,
},
}
impl RqsError {
#[must_use]
pub fn error_code(&self) -> &'static str {
match self {
Self::QueryTooLarge { .. } => "query_too_large",
Self::TooManyParameters { .. } => "too_many_parameters",
Self::InvalidEncoding => "invalid_encoding",
Self::InvalidFieldName { .. } => "invalid_field_name",
Self::InvalidColumnName { .. } => "invalid_column_name",
Self::UnknownField { .. } => "unknown_field",
Self::InvalidOperator => "invalid_operator",
Self::MissingValue { .. } => "missing_value",
Self::InvalidValue { .. } => "invalid_value",
Self::ValueTooLarge { .. } => "value_too_large",
Self::TooManyListItems { .. } => "too_many_list_items",
Self::InvalidPagination { .. } => "invalid_pagination",
Self::NegativePagination { .. } => "negative_pagination",
Self::LimitTooLarge { .. } => "limit_too_large",
Self::RegexDisabled { .. } => "regex_disabled",
Self::TextSearchUnsupported => "text_search_unsupported",
Self::DuplicateFilter { .. } => "duplicate_filter",
Self::AdapterUnsupported { .. } => "adapter_unsupported",
}
}
}
impl Display for RqsError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::QueryTooLarge { max_bytes } => {
write!(formatter, "query exceeds {max_bytes} bytes")
}
Self::TooManyParameters { max_parameters } => {
write!(formatter, "query exceeds {max_parameters} parameters")
}
Self::InvalidEncoding => write!(formatter, "query uses invalid percent encoding"),
Self::InvalidFieldName { field } => write!(formatter, "field {field} is invalid"),
Self::InvalidColumnName { column } => write!(formatter, "column {column} is invalid"),
Self::UnknownField { field } => write!(formatter, "field {field} is not allowed"),
Self::InvalidOperator => write!(formatter, "filter operator is invalid"),
Self::MissingValue { field } => write!(formatter, "field {field} needs a value"),
Self::InvalidValue { field, expected } => {
write!(formatter, "field {field} needs {expected}")
}
Self::ValueTooLarge { field, max_bytes } => {
write!(formatter, "field {field} exceeds {max_bytes} bytes")
}
Self::TooManyListItems { field, max_items } => {
write!(formatter, "field {field} exceeds {max_items} list items")
}
Self::InvalidPagination { parameter } => {
write!(formatter, "{parameter} pagination value is invalid")
}
Self::NegativePagination { parameter } => {
write!(formatter, "{parameter} pagination value cannot be negative")
}
Self::LimitTooLarge { max_limit } => {
write!(formatter, "limit exceeds {max_limit}")
}
Self::RegexDisabled { field } => {
write!(formatter, "field {field} does not allow regex filters")
}
Self::TextSearchUnsupported => write!(formatter, "text search is not supported"),
Self::DuplicateFilter { field, operator } => {
write!(formatter, "field {field} repeats operator {operator}")
}
Self::AdapterUnsupported { feature } => {
write!(formatter, "adapter does not support {feature}")
}
}
}
}
impl std::error::Error for RqsError {}