use std::sync::Arc;
use azure_data_cosmos_driver::models::CosmosResponseHeaders;
use serde::de::DeserializeOwned;
use crate::{
diagnostics::DiagnosticsContext,
feed::page::{FeedBody, FeedPage},
models::{CosmosResponse, ResponseHeaders},
};
#[derive(Debug)]
pub struct QueryFeedPage<T> {
page: FeedPage<T>,
index_metrics: Option<String>,
query_metrics: Option<String>,
}
impl<T> QueryFeedPage<T> {
pub fn as_feed_page(&self) -> &FeedPage<T> {
&self.page
}
pub fn items(&self) -> &[T] {
self.page.items()
}
pub fn into_items(self) -> Vec<T> {
self.page.into_items()
}
pub fn headers(&self) -> &ResponseHeaders {
self.page.headers()
}
pub fn diagnostics(&self) -> Arc<DiagnosticsContext> {
self.page.diagnostics()
}
pub fn index_metrics(&self) -> Option<&str> {
self.index_metrics.as_deref()
}
pub fn query_metrics(&self) -> Option<&str> {
self.query_metrics.as_deref()
}
}
impl<T: DeserializeOwned> QueryFeedPage<T> {
pub(crate) fn from_response(response: CosmosResponse) -> crate::Result<Self> {
let cosmos_headers: CosmosResponseHeaders =
crate::models::into_driver_headers(response.cosmos_headers().clone());
let index_metrics = cosmos_headers.index_metrics.clone();
let query_metrics = cosmos_headers.query_metrics.clone();
let diagnostics = response.diagnostics();
let body: FeedBody<T> = response.into_model()?;
Ok(Self {
page: FeedPage::new(
body.items,
ResponseHeaders::from(cosmos_headers),
diagnostics,
),
index_metrics,
query_metrics,
})
}
}
#[cfg(test)]
impl<T> QueryFeedPage<T> {
pub(crate) fn new_for_testing(
items: Vec<T>,
headers: ResponseHeaders,
diagnostics: Arc<DiagnosticsContext>,
) -> Self {
Self {
page: FeedPage::new(items, headers, diagnostics),
index_metrics: None,
query_metrics: None,
}
}
}