mod economics;
mod events;
mod metrics;
use serde::{Deserialize as SerdeDeserialize, Serialize};
use std::fmt;
#[derive(Clone, Copy, Debug, Eq, PartialEq, SerdeDeserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum NnsGovernanceCollectionStatus {
Ready,
Collecting,
Complete,
PageLimitReached,
}
impl NnsGovernanceCollectionStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Ready => "ready",
Self::Collecting => "collecting",
Self::Complete => "complete",
Self::PageLimitReached => "page_limit_reached",
}
}
}
impl fmt::Display for NnsGovernanceCollectionStatus {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, SerdeDeserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum NnsGovernanceExecutionAssurance {
UnreplicatedQuery,
ReplicatedExecution,
}
impl NnsGovernanceExecutionAssurance {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::UnreplicatedQuery => "unreplicated_query",
Self::ReplicatedExecution => "replicated_execution",
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, SerdeDeserialize, Serialize)]
#[serde(tag = "source_transport", rename_all = "snake_case")]
pub enum NnsGovernanceSourceProvenance {
ReplicaQuery {
endpoint: String,
fetched_by: String,
},
ReplicatedInterCanisterCall {
collector_canister_id: String,
},
}
impl NnsGovernanceSourceProvenance {
#[must_use]
pub const fn execution_assurance(&self) -> NnsGovernanceExecutionAssurance {
match self {
Self::ReplicaQuery { .. } => NnsGovernanceExecutionAssurance::UnreplicatedQuery,
Self::ReplicatedInterCanisterCall { .. } => {
NnsGovernanceExecutionAssurance::ReplicatedExecution
}
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, SerdeDeserialize, Serialize)]
pub struct NnsGovernanceReportContext {
pub schema_version: u32,
pub network: String,
pub governance_canister_id: String,
pub fetched_at: String,
pub source: NnsGovernanceSourceProvenance,
}
pub use economics::{
NnsGovernanceDecimal, NnsGovernanceEconomics, NnsGovernanceEconomicsReport,
NnsGovernancePercentage, NnsNeuronsFundEconomics,
NnsNeuronsFundMatchedFundingCurveCoefficients, NnsVotingPowerEconomics,
};
pub use events::{
NnsGovernanceMaturityModulation, NnsGovernanceMaturityModulationReport,
NnsGovernanceProposalId, NnsGovernanceRewardEvent, NnsGovernanceRewardEventReport,
};
pub use metrics::{
NnsGovernanceMetricBucket, NnsGovernanceMetrics, NnsGovernanceMetricsReport,
NnsGovernanceNeuronSubsetMetrics,
};
#[cfg(test)]
mod tests {
use super::NnsGovernanceCollectionStatus;
#[test]
fn collection_status_json_and_display_use_the_supported_labels() {
for (status, label) in [
(NnsGovernanceCollectionStatus::Ready, "ready"),
(NnsGovernanceCollectionStatus::Collecting, "collecting"),
(NnsGovernanceCollectionStatus::Complete, "complete"),
(
NnsGovernanceCollectionStatus::PageLimitReached,
"page_limit_reached",
),
] {
let value = serde_json::json!(label);
assert_eq!(
serde_json::to_value(status).expect("serialize status"),
value
);
assert_eq!(
serde_json::from_value::<NnsGovernanceCollectionStatus>(value)
.expect("deserialize status"),
status
);
assert_eq!(status.as_str(), label);
assert_eq!(status.to_string(), label);
}
}
}