#[cfg(all(feature = "canister", target_arch = "wasm32"))]
pub mod canister;
#[cfg(feature = "nns-host")]
pub mod host;
use super::{
NnsGovernanceEconomics, NnsGovernanceError, NnsGovernanceMaturityModulation,
NnsGovernanceMetrics, NnsGovernanceRequest, NnsGovernanceRewardEvent,
NnsGovernanceSourceProvenance,
};
use std::{future::Future, pin::Pin};
#[cfg(all(feature = "canister", target_arch = "wasm32"))]
pub use canister::CanisterNnsSource;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NnsGovernanceSourceData<T> {
pub value: T,
pub provenance: NnsGovernanceSourceProvenance,
}
impl<T> NnsGovernanceSourceData<T> {
#[must_use]
pub const fn new(value: T, provenance: NnsGovernanceSourceProvenance) -> Self {
Self { value, provenance }
}
}
pub type NnsGovernanceSourceFuture<'a, T> = Pin<
Box<dyn Future<Output = Result<NnsGovernanceSourceData<T>, NnsGovernanceError>> + Send + 'a>,
>;
pub trait NnsGovernanceSource: Send + Sync {
fn fetch_economics<'a>(
&'a self,
request: &'a NnsGovernanceRequest,
) -> NnsGovernanceSourceFuture<'a, NnsGovernanceEconomics>;
fn fetch_metrics<'a>(
&'a self,
request: &'a NnsGovernanceRequest,
) -> NnsGovernanceSourceFuture<'a, NnsGovernanceMetrics>;
fn fetch_reward_event<'a>(
&'a self,
request: &'a NnsGovernanceRequest,
) -> NnsGovernanceSourceFuture<'a, NnsGovernanceRewardEvent>;
fn fetch_maturity_modulation<'a>(
&'a self,
request: &'a NnsGovernanceRequest,
) -> NnsGovernanceSourceFuture<'a, Option<NnsGovernanceMaturityModulation>>;
}
#[cfg(any(feature = "nns-host", feature = "canister"))]
pub(super) fn metrics_result(
result: super::wire::GetMetricsResult,
) -> Result<super::wire::GovernanceCachedMetrics, NnsGovernanceError> {
match result {
super::wire::GetMetricsResult::Ok(metrics) => Ok(*metrics),
super::wire::GetMetricsResult::Err(error) => Err(NnsGovernanceError::Governance {
error_type: error.error_type,
message: error.error_message,
}),
}
}