Skip to main content

circles_rpc/methods/
trust.rs

1use crate::client::RpcClient;
2use crate::error::Result;
3use circles_types::{Address, AggregatedTrustRelation, TrustRelation, TrustRelationType};
4
5/// Methods for trust relation queries.
6///
7/// Wraps `circles_getTrustRelations` and `circles_getCommonTrust`.
8#[derive(Clone, Debug)]
9pub struct TrustMethods {
10    client: RpcClient,
11}
12
13impl TrustMethods {
14    /// Create a new accessor for trust-related RPCs.
15    pub fn new(client: RpcClient) -> Self {
16        Self { client }
17    }
18
19    /// circles_getTrustRelations
20    pub async fn get_trust_relations(&self, address: Address) -> Result<Vec<TrustRelation>> {
21        self.client
22            .call("circles_getTrustRelations", (address,))
23            .await
24    }
25
26    /// circles_getAggregatedTrustRelations
27    pub async fn get_aggregated_trust_relations(
28        &self,
29        avatar: Address,
30    ) -> Result<Vec<AggregatedTrustRelation>> {
31        self.client
32            .call("circles_getAggregatedTrustRelations", (avatar,))
33            .await
34    }
35
36    /// circles_getCommonTrust
37    pub async fn get_common_trust(
38        &self,
39        avatar_a: Address,
40        avatar_b: Address,
41    ) -> Result<Vec<TrustRelationType>> {
42        self.client
43            .call("circles_getCommonTrust", (avatar_a, avatar_b))
44            .await
45    }
46
47    /// Filter aggregated relations to only the avatars that trust `avatar`.
48    pub async fn get_trusted_by(&self, avatar: Address) -> Result<Vec<AggregatedTrustRelation>> {
49        let relations = self.get_aggregated_trust_relations(avatar).await?;
50        Ok(relations
51            .into_iter()
52            .filter(|rel| matches!(rel.relation, TrustRelationType::TrustedBy))
53            .collect())
54    }
55
56    /// Filter aggregated relations to only the avatars trusted by `avatar`.
57    pub async fn get_trusts(&self, avatar: Address) -> Result<Vec<AggregatedTrustRelation>> {
58        let relations = self.get_aggregated_trust_relations(avatar).await?;
59        Ok(relations
60            .into_iter()
61            .filter(|rel| matches!(rel.relation, TrustRelationType::Trusts))
62            .collect())
63    }
64
65    /// Filter aggregated relations to mutual trust edges only.
66    pub async fn get_mutual_trusts(&self, avatar: Address) -> Result<Vec<AggregatedTrustRelation>> {
67        let relations = self.get_aggregated_trust_relations(avatar).await?;
68        Ok(relations
69            .into_iter()
70            .filter(|rel| matches!(rel.relation, TrustRelationType::MutuallyTrusts))
71            .collect())
72    }
73}