Skip to main content

dash_platform_queries/documents/
document_split_sums.rs

1//! `FromProof` + `Fetch` for [`DocumentSplitSums`] — the
2//! per-group-entry view of the unified `getDocuments` endpoint
3//! for sum queries.
4//!
5//! Sum-side analog of [`super::document_split_counts`]. Returns
6//! the full `entries` list (keyed by the splitting property's
7//! serialized value); aggregate sums use
8//! [`super::document_sum::DocumentSum`] instead.
9//!
10//! Per-shape proof dispatch lives in
11//! [`super::sum_proof_helpers::verify_sum_query`] — this impl
12//! passes the verified entries through unchanged, mapping
13//! `SumEntry` to `SplitSumEntry`.
14
15use crate::documents::document_query::DocumentQuery;
16use crate::documents::sum_proof_helpers::{assert_select_is_sum, verify_sum_query};
17use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata};
18use dash_context_provider::ContextProvider;
19use dpp::dashcore::Network;
20use dpp::version::PlatformVersion;
21use drive_proof_verifier::{DocumentSplitSums, FromProof, SplitSumEntry};
22
23impl FromProof<DocumentQuery> for DocumentSplitSums {
24    type Request = DocumentQuery;
25    type Response = GetDocumentsResponse;
26
27    fn maybe_from_proof_with_metadata<'a, I: Into<Self::Request>, O: Into<Self::Response>>(
28        request: I,
29        response: O,
30        _network: Network,
31        platform_version: &PlatformVersion,
32        provider: &'a dyn ContextProvider,
33    ) -> Result<(Option<Self>, ResponseMetadata, Proof), drive_proof_verifier::Error>
34    where
35        Self: 'a,
36    {
37        let request: Self::Request = request.into();
38        assert_select_is_sum(&request)?;
39        let response: Self::Response = response.into();
40        let (entries, mtd, proof) =
41            verify_sum_query(request, response, platform_version, provider)?;
42        let split = entries.map(|es| {
43            DocumentSplitSums(
44                es.into_iter()
45                    .map(|e| SplitSumEntry {
46                        in_key: e.in_key,
47                        key: e.key,
48                        sum: e.sum,
49                    })
50                    .collect(),
51            )
52        });
53        Ok((split, mtd, proof))
54    }
55}