mockforge-data 0.3.241

Data generator for MockForge - faker + RAG synthetic data engine
Documentation
use super::*;

impl QdrantStorage {
    pub(super) fn endpoint(&self, suffix: &[&str]) -> url::Url {
        let mut url = self.base.clone();
        url.path_segments_mut()
            .expect("validated HTTP URL")
            .pop_if_empty()
            .extend(["collections", self.collection.as_str()])
            .extend(suffix.iter().copied());
        url
    }

    pub(super) fn request(&self, method: Method, suffix: &[&str]) -> reqwest::RequestBuilder {
        self.client.request(method, self.endpoint(suffix))
    }

    pub(super) async fn send(request: reqwest::RequestBuilder) -> Result<Response> {
        let response = request.send().await.map_err(|_| Error::generic("Qdrant request failed"))?;
        if !response.status().is_success() {
            return Err(Error::generic(format!(
                "Qdrant returned HTTP {}",
                response.status().as_u16()
            )));
        }
        Ok(response)
    }

    pub(super) async fn result(request: reqwest::RequestBuilder) -> Result<Value> {
        Self::response_result(Self::send(request).await?).await
    }

    pub(super) async fn response_result(mut response: Response) -> Result<Value> {
        if !response.status().is_success() {
            return Err(Error::generic(format!(
                "Qdrant returned HTTP {}",
                response.status().as_u16()
            )));
        }
        let mut bytes = Vec::new();
        while let Some(chunk) = response
            .chunk()
            .await
            .map_err(|_| Error::generic("Qdrant response interrupted"))?
        {
            if bytes.len().saturating_add(chunk.len()) > 64 * 1024 * 1024 {
                return Err(Error::generic("Qdrant JSON response exceeds 64 MiB"));
            }
            bytes.extend_from_slice(&chunk);
        }
        let mut body: Value = serde_json::from_slice(&bytes)
            .map_err(|_| Error::generic("Invalid Qdrant JSON response"))?;
        body.get_mut("result")
            .map(Value::take)
            .ok_or_else(|| Error::generic("Qdrant response omitted result"))
    }
}