Skip to main content

ic_query/subnet_catalog/resolver/
model.rs

1use crate::subnet_catalog::{RoutingRange, SubnetInfo};
2use serde::{Deserialize, Serialize};
3use std::str::FromStr;
4
5///
6/// ResolveAs
7///
8#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
9#[serde(rename_all = "snake_case")]
10pub enum ResolveAs {
11    Subnet,
12    Canister,
13}
14
15impl ResolveAs {
16    #[must_use]
17    pub const fn as_str(self) -> &'static str {
18        match self {
19            Self::Subnet => "subnet",
20            Self::Canister => "canister",
21        }
22    }
23}
24
25impl FromStr for ResolveAs {
26    type Err = String;
27
28    fn from_str(value: &str) -> Result<Self, Self::Err> {
29        match value {
30            "subnet" => Ok(Self::Subnet),
31            "canister" => Ok(Self::Canister),
32            other => Err(format!("invalid value {other}; use subnet or canister")),
33        }
34    }
35}
36
37///
38/// ResolvedSubnetSubject
39///
40#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
41#[serde(rename_all = "snake_case")]
42pub enum ResolvedSubnetSubject {
43    Subnet,
44    Canister,
45}
46
47impl ResolvedSubnetSubject {
48    #[must_use]
49    pub const fn as_str(self) -> &'static str {
50        match self {
51            Self::Subnet => "subnet",
52            Self::Canister => "canister",
53        }
54    }
55}
56
57///
58/// ResolvedSubnet
59///
60#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
61pub struct ResolvedSubnet {
62    pub input_principal: String,
63    pub resolved_as: ResolvedSubnetSubject,
64    pub resolved_from: String,
65    pub subnet: SubnetInfo,
66    pub matched_canister_principal: Option<String>,
67    pub matched_routing_range: Option<RoutingRange>,
68}