mod paged;
mod query;
mod write;
use crate::{error::Error, traits::EntityKind, types::Id};
use icydb_core::db::{
EntityResponse as CoreEntityResponse, ProjectedRow as CoreProjectedRow,
ProjectionResponse as CoreProjectionResponse,
ResponseCardinalityExt as CoreResponseCardinalityExt,
};
pub use paged::{PagedGroupedResponse, PagedResponse};
pub use query::QueryResponse;
pub use write::*;
#[derive(Debug)]
pub struct Response<E: EntityKind> {
inner: CoreEntityResponse<E>,
}
impl<E: EntityKind> Response<E> {
#[must_use]
pub const fn from_core(inner: CoreEntityResponse<E>) -> Self {
Self { inner }
}
#[must_use]
pub const fn count(&self) -> u32 {
self.inner.count()
}
#[must_use]
pub const fn exists(&self) -> bool {
!self.inner.is_empty()
}
pub fn require_one(&self) -> Result<(), Error> {
CoreResponseCardinalityExt::require_one(&self.inner).map_err(Into::into)
}
pub fn require_some(&self) -> Result<(), Error> {
CoreResponseCardinalityExt::require_some(&self.inner).map_err(Into::into)
}
pub fn entity(self) -> Result<E, Error> {
CoreResponseCardinalityExt::entity(self.inner).map_err(Into::into)
}
pub fn try_entity(self) -> Result<Option<E>, Error> {
CoreResponseCardinalityExt::try_entity(self.inner).map_err(Into::into)
}
#[must_use]
pub fn entities(self) -> Vec<E> {
self.inner.entities()
}
pub fn require_id(self) -> Result<Id<E>, Error> {
CoreResponseCardinalityExt::require_id(self.inner).map_err(Into::into)
}
pub fn try_id(self) -> Result<Option<Id<E>>, Error> {
CoreResponseCardinalityExt::try_row(self.inner)
.map(|row| row.map(|entry| entry.id()))
.map_err(Into::into)
}
pub fn ids(&self) -> impl Iterator<Item = Id<E>> + '_ {
self.inner.ids()
}
pub fn contains_id(&self, id: &Id<E>) -> bool {
self.inner.contains_id(id)
}
}
#[derive(Debug)]
pub struct ProjectionResponse<E: EntityKind> {
inner: CoreProjectionResponse<E>,
}
impl<E: EntityKind> ProjectionResponse<E> {
#[must_use]
pub const fn from_core(inner: CoreProjectionResponse<E>) -> Self {
Self { inner }
}
#[must_use]
pub const fn count(&self) -> u32 {
self.inner.count()
}
#[must_use]
pub const fn exists(&self) -> bool {
!self.inner.is_empty()
}
#[must_use]
pub fn rows(self) -> Vec<CoreProjectedRow<E>> {
self.inner.rows()
}
pub fn iter(&self) -> std::slice::Iter<'_, CoreProjectedRow<E>> {
self.inner.iter()
}
}
impl<'a, E: EntityKind> IntoIterator for &'a ProjectionResponse<E> {
type Item = &'a CoreProjectedRow<E>;
type IntoIter = std::slice::Iter<'a, CoreProjectedRow<E>>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<E: EntityKind> IntoIterator for ProjectionResponse<E> {
type Item = CoreProjectedRow<E>;
type IntoIter = std::vec::IntoIter<CoreProjectedRow<E>>;
fn into_iter(self) -> Self::IntoIter {
self.rows().into_iter()
}
}