Skip to main content

ic_query/subnet_catalog/
error.rs

1use crate::subnet_catalog::RoutingRange;
2use thiserror::Error as ThisError;
3
4///
5/// CatalogError
6///
7/// Errors returned while parsing, validating, or resolving a subnet catalog.
8///
9
10#[derive(Debug, ThisError)]
11pub enum CatalogError {
12    #[error(transparent)]
13    Json(#[from] serde_json::Error),
14
15    #[error("unsupported subnet catalog schema version {found}; supported version is {supported}")]
16    UnsupportedSchemaVersion { found: u32, supported: u32 },
17
18    #[error("subnet catalog must contain at least one subnet")]
19    EmptySubnets,
20
21    #[error("subnet catalog must contain at least one routing range")]
22    EmptyRoutingRanges,
23
24    #[error("invalid principal in {field}: {value}: {reason}")]
25    InvalidPrincipal {
26        field: &'static str,
27        value: String,
28        reason: String,
29    },
30
31    #[error("duplicate subnet principal in catalog: {subnet_principal}")]
32    DuplicateSubnet { subnet_principal: String },
33
34    #[error("routing range references unknown subnet: {subnet_principal}")]
35    UnknownRoutingSubnet { subnet_principal: String },
36
37    #[error(
38        "invalid routing range for {subnet_principal}: start {start_canister_id} sorts after end {end_canister_id}"
39    )]
40    InvalidRoutingRange {
41        subnet_principal: String,
42        start_canister_id: String,
43        end_canister_id: String,
44    },
45
46    #[error("overlapping routing ranges: {first} overlaps {second}")]
47    OverlappingRoutingRanges {
48        first: Box<RoutingRange>,
49        second: Box<RoutingRange>,
50    },
51
52    #[error("subnet principal {subnet_principal} was not found in the cached catalog")]
53    UnknownSubnet { subnet_principal: String },
54
55    #[error("principal prefix {prefix:?} did not match cached subnet principals")]
56    PrincipalPrefixNotFound { prefix: String },
57
58    #[error("principal prefix {prefix:?} is ambiguous; matches: {matches:?}")]
59    AmbiguousPrincipalPrefix {
60        prefix: String,
61        matches: Vec<String>,
62    },
63
64    #[error(
65        "canister principal {canister_principal} was not covered by cached routing ranges at registry_version={registry_version}, catalog_schema_version={catalog_schema_version}"
66    )]
67    RouteNotFound {
68        canister_principal: String,
69        registry_version: u64,
70        catalog_schema_version: u32,
71    },
72}