use crate::observatory::view::{CostEvidenceLimitation, Observation, ObservatoryAuthorityView};
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CostComparisonFailure {
AuthorityUnavailable,
BindingChanged,
BindingUnavailable,
CounterDecreased,
CounterWindowChanged,
InvalidMetric,
InvalidSnapshot,
MissingCosts,
MissingMetric,
MissingParent,
NonAdvancingWindow,
Overflow,
SaturatedCounter,
SnapshotUnavailable,
SourceWindowChanged,
SourceWindowUnavailable,
StaleSample,
TimeWindowsDiffer,
TruncatedSample,
UnsupportedSchema,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "state", rename_all = "snake_case", deny_unknown_fields)]
pub enum CostComparisonResult<T> {
Available { value: T },
Unavailable { reason: CostComparisonFailure },
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct CycleMovementView {
pub start_ns: u64,
pub end_ns: u64,
pub elapsed_ns: u64,
pub cycles: String,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct RoleCostComparisonView {
pub role: String,
pub canister_id: String,
#[serde(deserialize_with = "Option::deserialize")]
pub parent_canister_id: Option<String>,
pub balance_change: CostComparisonResult<CycleMovementView>,
pub incoming_grants: CostComparisonResult<CycleMovementView>,
pub outgoing_grants: CostComparisonResult<CycleMovementView>,
pub known_grant_adjusted_decrease: CostComparisonResult<CycleMovementView>,
pub limitations: Vec<CostEvidenceLimitation>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ObservatoryComparisonView {
pub schema_version: u16,
pub environment: String,
pub fleet: String,
pub recorded_authority: Observation<ObservatoryAuthorityView>,
pub before_collected_at_unix_ms: u64,
pub after_collected_at_unix_ms: u64,
pub roles: Vec<RoleCostComparisonView>,
}