use crate::{
ic_registry::MAINNET_GOVERNANCE_CANISTER_ID,
snapshot_cache::{SnapshotRefreshAttempt, SnapshotRefreshProgress},
};
use serde::{Deserialize as SerdeDeserialize, Serialize};
use std::path::{Path, PathBuf};
pub(super) const NNS_GOVERNANCE_ATTEMPT_METADATA_FIELDS: &[&str] = &["governance_canister_id"];
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NnsGovernanceRefreshRequest {
pub cache_root: PathBuf,
pub network: String,
pub source_endpoint: String,
pub now_unix_secs: u64,
pub page_size: u32,
pub max_pages: Option<u32>,
}
impl NnsGovernanceRefreshRequest {
#[must_use]
pub fn new(
cache_root: impl Into<PathBuf>,
network: impl Into<String>,
source_endpoint: impl Into<String>,
now_unix_secs: u64,
page_size: u32,
) -> Self {
Self {
cache_root: cache_root.into(),
network: network.into(),
source_endpoint: source_endpoint.into(),
now_unix_secs,
page_size,
max_pages: None,
}
}
#[must_use]
pub const fn with_max_pages(mut self, max_pages: Option<u32>) -> Self {
self.max_pages = max_pages;
self
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NnsGovernanceCacheRequest {
pub cache_root: PathBuf,
pub network: String,
}
impl NnsGovernanceCacheRequest {
#[must_use]
pub fn new(cache_root: impl Into<PathBuf>, network: impl Into<String>) -> Self {
Self {
cache_root: cache_root.into(),
network: network.into(),
}
}
#[must_use]
pub fn cache_root(&self) -> &Path {
&self.cache_root
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct NnsGovernanceRefreshAttemptStatus {
pub status: String,
pub started_at: String,
pub updated_at: String,
pub page_size: u32,
pub pages_fetched: u32,
pub rows_fetched: usize,
pub last_cursor: Option<String>,
pub last_error: Option<String>,
}
#[derive(Clone, Debug, Eq, PartialEq, SerdeDeserialize, Serialize)]
pub(super) struct NnsGovernanceCacheMetadata {
pub(super) governance_canister_id: String,
}
#[must_use]
pub(super) fn mainnet_governance_cache_metadata() -> NnsGovernanceCacheMetadata {
NnsGovernanceCacheMetadata {
governance_canister_id: MAINNET_GOVERNANCE_CANISTER_ID.to_string(),
}
}
pub(super) fn validate_governance_cache_metadata(
metadata: &NnsGovernanceCacheMetadata,
) -> Result<(), String> {
if metadata.governance_canister_id == MAINNET_GOVERNANCE_CANISTER_ID {
return Ok(());
}
Err(format!(
"governance_canister_id is {}, expected {MAINNET_GOVERNANCE_CANISTER_ID}",
metadata.governance_canister_id
))
}
#[must_use]
pub(super) fn governance_refresh_attempt_status<Metadata>(
attempt: SnapshotRefreshAttempt<Metadata>,
) -> NnsGovernanceRefreshAttemptStatus {
NnsGovernanceRefreshAttemptStatus {
status: attempt.status,
started_at: attempt.started_at,
updated_at: attempt.updated_at,
page_size: attempt.page_size,
pages_fetched: attempt.pages_fetched,
rows_fetched: attempt.rows_fetched,
last_cursor: attempt.last_cursor,
last_error: attempt.last_error,
}
}
#[must_use]
pub(super) fn governance_refresh_progress<Metadata>(
attempt: SnapshotRefreshAttempt<Metadata>,
) -> SnapshotRefreshProgress {
SnapshotRefreshProgress::new(
attempt.pages_fetched,
attempt.rows_fetched,
attempt.last_cursor,
)
}