use super::query::QueryError;
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum QueryStatus {
Pending,
Success,
Error,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum FetchStatus {
Idle,
Fetching,
}
#[derive(Debug, Clone)]
pub struct QueryResult<T> {
data: Option<T>,
error: Option<QueryError>,
status: QueryStatus,
fetch_status: FetchStatus,
is_stale: bool,
}
impl<T> QueryResult<T> {
pub(crate) const fn pending(fetch_status: FetchStatus) -> Self {
Self {
data: None,
error: None,
status: QueryStatus::Pending,
fetch_status,
is_stale: false,
}
}
pub(crate) const fn success(data: T, is_stale: bool, fetch_status: FetchStatus) -> Self {
Self {
data: Some(data),
error: None,
status: QueryStatus::Success,
fetch_status,
is_stale,
}
}
pub(crate) const fn failed(
error: QueryError,
data: Option<T>,
is_stale: bool,
fetch_status: FetchStatus,
) -> Self {
Self {
data,
error: Some(error),
status: QueryStatus::Error,
fetch_status,
is_stale,
}
}
pub const fn data(&self) -> Option<&T> {
self.data.as_ref()
}
pub const fn error(&self) -> Option<&QueryError> {
self.error.as_ref()
}
pub const fn status(&self) -> QueryStatus {
self.status
}
pub const fn fetch_status(&self) -> FetchStatus {
self.fetch_status
}
pub const fn is_loading(&self) -> bool {
matches!(self.status, QueryStatus::Pending)
}
pub const fn is_success(&self) -> bool {
matches!(self.status, QueryStatus::Success)
}
pub const fn is_error(&self) -> bool {
matches!(self.status, QueryStatus::Error)
}
pub const fn is_fetching(&self) -> bool {
matches!(self.fetch_status, FetchStatus::Fetching)
}
pub const fn is_stale(&self) -> bool {
self.is_stale
}
}