identity_document/utils/
queryable.rs

1// Copyright 2020-2023 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use identity_core::common::KeyComparable;
5use identity_core::common::OrderedSet;
6
7use crate::utils::DIDUrlQuery;
8use identity_did::DIDUrl;
9
10/// Allows retrieving an entry from a collection using a custom query type.
11///
12/// Used for querying verification methods in a DID Document by either its full DID Url identifier
13/// or only its fragment. See [`DIDUrlQuery`].
14pub trait Queryable<T, Q> {
15  /// Returns a reference to an entry matching the query if one exists.
16  fn query(&self, query: Q) -> Option<&T>;
17  /// Returns a mutable reference to an entry matching the query if one exists.
18  fn query_mut(&mut self, query: Q) -> Option<&mut T>;
19}
20
21impl<'query, T, Q> Queryable<T, Q> for OrderedSet<T>
22where
23  T: KeyComparable,
24  <T as KeyComparable>::Key: AsRef<DIDUrl>,
25  Q: Into<DIDUrlQuery<'query>>,
26{
27  fn query(&self, query: Q) -> Option<&T> {
28    let query: DIDUrlQuery<'query> = query.into();
29    self.iter().find(|entry| query.matches(entry.key().as_ref()))
30  }
31
32  /// WARNING: improper usage of this allows violating the key-uniqueness of the OrderedSet.
33  fn query_mut(&mut self, query: Q) -> Option<&mut T> {
34    let query: DIDUrlQuery<'query> = query.into();
35    self
36      .iter_mut_unchecked()
37      .find(|entry| query.matches(entry.key().as_ref()))
38  }
39}