use std::{fmt, sync::Arc};
pub use self::{concept_document::ConceptDocument, concept_row::ConceptRow, json::JSON};
use crate::{
BoxStream, Result,
answer::{concept_document::ConceptDocumentHeader, concept_row::ConceptRowHeader},
};
pub mod concept_document;
pub mod concept_row;
mod json;
pub enum QueryAnswer {
Ok(QueryType),
ConceptRowStream(Arc<ConceptRowHeader>, BoxStream<'static, Result<ConceptRow>>),
ConceptDocumentStream(Arc<ConceptDocumentHeader>, BoxStream<'static, Result<ConceptDocument>>),
}
impl QueryAnswer {
pub fn get_query_type(&self) -> QueryType {
match self {
&QueryAnswer::Ok(query_type) => query_type,
QueryAnswer::ConceptRowStream(header, _) => header.query_type,
QueryAnswer::ConceptDocumentStream(header, _) => header.query_type,
}
}
pub fn is_ok(&self) -> bool {
matches!(self, Self::Ok(_))
}
pub fn is_row_stream(&self) -> bool {
matches!(self, Self::ConceptRowStream(_, _))
}
pub fn is_document_stream(&self) -> bool {
matches!(self, Self::ConceptDocumentStream(_, _))
}
pub fn into_rows(self) -> BoxStream<'static, Result<ConceptRow>> {
let Self::ConceptRowStream(_, stream) = self else { panic!("Query answer is not a rows stream.") };
stream
}
pub fn into_documents(self) -> BoxStream<'static, Result<ConceptDocument>> {
if let Self::ConceptDocumentStream(_, stream) = self {
stream
} else {
panic!("Query answer is not a documents stream.")
}
}
}
impl fmt::Debug for QueryAnswer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
QueryAnswer::Ok(_) => write!(f, "QueryAnswer::Ok"),
QueryAnswer::ConceptRowStream(_, _) => write!(f, "QueryAnswer::ConceptRowStream(<stream>)"),
QueryAnswer::ConceptDocumentStream(_, _) => write!(f, "QueryAnswer::ConceptDocumentStream(<stream>)"),
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Hash, PartialEq, Eq, Debug)]
pub enum QueryType {
ReadQuery,
WriteQuery,
SchemaQuery,
}