use std::num::NonZeroUsize;
use std::sync::Arc;
use async_trait::async_trait;
use crate::dht::Did;
#[cfg(not(all(feature = "wasm", target_family = "wasm")))]
pub type MeasureImpl = Arc<dyn BehaviourJudgement + Send + Sync>;
#[cfg(all(feature = "wasm", target_family = "wasm"))]
pub type MeasureImpl = Arc<dyn BehaviourJudgement>;
use rings_measure::ApplyOutcome;
use rings_measure::MeasureError;
use super::Authentication;
use super::MeasureCounter;
use super::MeasurementBatch;
use super::MeasurementEvent;
use super::PeerMeasurement;
use super::PeerMeasurementPage;
use super::PeerQuality;
#[cfg_attr(all(feature = "wasm", target_family = "wasm"), async_trait(?Send))]
#[cfg_attr(not(all(feature = "wasm", target_family = "wasm")), async_trait)]
pub trait Measure {
async fn incr(&self, did: Did, counter: MeasureCounter);
async fn get_count(&self, did: Did, counter: MeasureCounter) -> u64;
async fn record(
&self,
did: Did,
authentication: Authentication,
event: MeasurementEvent,
) -> Result<ApplyOutcome, MeasureError> {
if !authentication.permits(event) {
return Ok(ApplyOutcome::IgnoredUnattributable);
}
self.incr(did, MeasureCounter::from_event(event)).await;
Ok(ApplyOutcome::Applied)
}
async fn record_batch(
&self,
did: Did,
authentication: Authentication,
batch: MeasurementBatch,
) -> Result<ApplyOutcome, MeasureError> {
if !authentication.permits(batch.event()) {
return Ok(ApplyOutcome::IgnoredUnattributable);
}
let counter = MeasureCounter::from_event(batch.event());
for _ in 0..batch.occurrences().get() {
self.incr(did, counter).await;
}
Ok(ApplyOutcome::Applied)
}
async fn peer_measurement(&self, _did: Did) -> Result<Option<PeerMeasurement>, MeasureError> {
Ok(None)
}
async fn peer_measurements(&self) -> Result<Vec<PeerMeasurement>, MeasureError> {
Ok(Vec::new())
}
async fn peer_measurements_page(
&self,
_after: Option<Did>,
_limit: NonZeroUsize,
) -> Result<PeerMeasurementPage, MeasureError> {
Ok(PeerMeasurementPage::default())
}
}
#[cfg_attr(all(feature = "wasm", target_family = "wasm"), async_trait(?Send))]
#[cfg_attr(not(all(feature = "wasm", target_family = "wasm")), async_trait)]
pub trait BehaviourJudgement: Measure {
async fn quality(&self, did: Did) -> PeerQuality;
}