Skip to main content

r402_server/
matching.rs

1//! Requirement matching against a client payload.
2
3use r402_protocol::payment::PaymentRequirements;
4
5use crate::hooks::WirePaymentPayload;
6use crate::resource::ResourceServer;
7use crate::scheme::DynSchemeNetworkServer;
8
9impl ResourceServer {
10    /// First available accept that matches `payload.accepted`.
11    ///
12    /// Scheme-declared [`crate::SchemeNetworkServer::dynamic_extra_fields`] are
13    /// omitted from the extra-subset comparison.
14    #[must_use]
15    pub fn find_matching_requirements<'a>(
16        &self,
17        available: &'a [PaymentRequirements],
18        payload: &WirePaymentPayload,
19    ) -> Option<&'a PaymentRequirements> {
20        available.iter().find(|req| {
21            let dynamic = self
22                .registered_scheme(req.scheme.as_str(), &req.network)
23                .map_or(&[][..], DynSchemeNetworkServer::dynamic_extra_fields);
24            req.matches_payload_accepted_with_dynamic(&payload.accepted, dynamic)
25        })
26    }
27}