1use thiserror::Error;
2
3use crate::Metric;
4use crate::UnixTime;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
8pub enum PolicyError {
9 #[error("reliability window must be non-zero")]
11 ZeroReliabilityWindow,
12 #[error("credit retention must be non-zero")]
14 ZeroCreditRetention,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Error)]
19pub enum MeasureError {
20 #[error("measurement counter overflow: {metric:?}")]
22 CounterOverflow {
23 metric: Metric,
25 },
26 #[error("measurement clock regressed from {current:?} to {observed:?}")]
28 ClockRegression {
29 observed: UnixTime,
31 current: UnixTime,
33 },
34 #[error(
36 "reliability window changed from {stored_seconds}s to {supplied_seconds}s without migration"
37 )]
38 ReliabilityWindowMismatch {
39 stored_seconds: u64,
41 supplied_seconds: u64,
43 },
44 #[error("unsupported measurement snapshot version {found}")]
46 UnsupportedSnapshotVersion {
47 found: u16,
49 },
50 #[error("measurement snapshot has {found} peers, exceeding limit {max}")]
52 SnapshotPeerLimitExceeded {
53 found: usize,
55 max: usize,
57 },
58 #[error("measurement snapshot contains a duplicate peer")]
60 DuplicatePeerInSnapshot,
61 #[error("measurement snapshot has reliability evidence without an epoch")]
63 SnapshotEvidenceWithoutEpoch,
64 #[error("measurement snapshot has an empty timestamped reliability epoch")]
66 SnapshotEpochWithoutEvidence,
67 #[error("measurement snapshot reliability epoch has no window policy")]
69 SnapshotReliabilityWindowMissing,
70 #[error("measurement snapshot has a reliability window without an epoch")]
72 SnapshotReliabilityWindowWithoutEpoch,
73 #[error("measurement snapshot reliability epoch is not window-aligned")]
75 SnapshotReliabilityEpochMisaligned,
76}