Skip to main content

dash_platform_queries/documents/
document_count.rs

1//! `FromProof` + `Fetch` for [`DocumentCount`] — the single-row
2//! aggregate count view of the unified `getDocuments` endpoint.
3//!
4//! Callers build a [`DocumentQuery`] with
5//! `.with_select(Select::Count)`, optionally adding a
6//! `with_where(...)` clause; whatever the request shape, this
7//! impl returns a single `u64` (the aggregate count). Per-shape
8//! proof dispatch lives in
9//! [`super::count_proof_helpers::verify_count_query`] — this
10//! impl just sums the verified entries the helper returns.
11//!
12//! Empty entries (e.g. a verifier that emitted `None` for a
13//! queried-but-absent branch) contribute 0 to the sum via
14//! `filter_map(|e| e.count)`.
15
16use crate::documents::count_proof_helpers::{assert_select_is_count, verify_count_query};
17use crate::documents::document_query::DocumentQuery;
18use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata};
19use dash_context_provider::ContextProvider;
20use dpp::dashcore::Network;
21use dpp::version::PlatformVersion;
22use drive_proof_verifier::{DocumentCount, FromProof};
23
24impl FromProof<DocumentQuery> for DocumentCount {
25    type Request = DocumentQuery;
26    type Response = GetDocumentsResponse;
27
28    fn maybe_from_proof_with_metadata<'a, I: Into<Self::Request>, O: Into<Self::Response>>(
29        request: I,
30        response: O,
31        _network: Network,
32        platform_version: &PlatformVersion,
33        provider: &'a dyn ContextProvider,
34    ) -> Result<(Option<Self>, ResponseMetadata, Proof), drive_proof_verifier::Error>
35    where
36        Self: 'a,
37    {
38        let request: Self::Request = request.into();
39        assert_select_is_count(&request)?;
40        let response: Self::Response = response.into();
41        let (entries, mtd, proof) =
42            verify_count_query(request, response, platform_version, provider)?;
43        let count = entries
44            .map(|es| es.iter().filter_map(|e| e.count).sum::<u64>())
45            .map(DocumentCount);
46        Ok((count, mtd, proof))
47    }
48}