rings_core/measure/
quality.rs1use super::Measure;
2use super::MeasureCounter;
3use crate::dht::Did;
4
5pub type PeerQuality = rings_measure::ReliabilityClass;
7
8pub type PeerQualityThresholds = rings_measure::ReliabilityThresholds;
10
11pub type PeerQualityEvidence = rings_measure::ReliabilityEvidence;
13
14#[derive(Debug, Clone, Copy, PartialEq)]
19pub struct PeerMeasurement {
20 pub did: Did,
22 pub evidence: PeerQualityEvidence,
24 pub credit: Option<rings_measure::CreditRecord>,
26 pub credit_score: rings_measure::CreditScore,
28 pub quality: PeerQuality,
30}
31
32#[derive(Debug, Clone, PartialEq, Default)]
34pub struct PeerMeasurementPage {
35 pub measurements: Vec<PeerMeasurement>,
37 pub next_cursor: Option<Did>,
39}
40
41impl PeerMeasurement {
42 pub fn from_projected(projected: rings_measure::PeerMeasurement<Did>) -> Self {
44 Self {
45 did: projected.peer,
46 evidence: projected.reliability,
47 credit: Some(projected.credit),
48 credit_score: projected.credit_score,
49 quality: projected.reliability_class,
50 }
51 }
52}
53
54pub async fn peer_evidence_from_counters<M>(measure: &M, did: Did) -> Option<PeerQualityEvidence>
59where M: Measure + ?Sized {
60 let evidence = PeerQualityEvidence {
61 connected: measure.get_count(did, MeasureCounter::Connect).await,
62 disconnected: measure.get_count(did, MeasureCounter::Disconnected).await,
63 sent: measure.get_count(did, MeasureCounter::Sent).await,
64 failed_to_send: measure.get_count(did, MeasureCounter::FailedToSend).await,
65 received: measure.get_count(did, MeasureCounter::Received).await,
66 failed_to_receive: measure
67 .get_count(did, MeasureCounter::FailedToReceive)
68 .await,
69 };
70 (!evidence.is_unobserved()).then_some(evidence)
71}
72
73pub fn order_peers_by_quality(
77 candidates: impl IntoIterator<Item = (Did, PeerQuality)>,
78) -> Vec<Did> {
79 rings_measure::order_peers_by_reliability(candidates)
80}