ic_query/subnet_catalog/resolver/
subnet.rs1use super::{ResolveAs, ResolvedSubnet, ResolvedSubnetSubject};
2use crate::subnet_catalog::{CatalogError, SubnetCatalog, canonical_principal_text};
3
4impl SubnetCatalog {
5 pub fn resolve_principal(
7 &self,
8 input: &str,
9 forced: Option<ResolveAs>,
10 ) -> Result<ResolvedSubnet, CatalogError> {
11 let input_principal = canonical_principal_text(input)?;
12 match forced {
13 Some(ResolveAs::Subnet) => self.resolve_known_subnet(&input_principal),
14 None if self.subnet_by_principal(&input_principal).is_some() => {
15 self.resolve_known_subnet(&input_principal)
16 }
17 Some(ResolveAs::Canister) | None => self.resolve_canister(&input_principal),
18 }
19 }
20
21 pub(super) fn resolve_known_subnet(
22 &self,
23 input_principal: &str,
24 ) -> Result<ResolvedSubnet, CatalogError> {
25 let subnet = self
26 .subnet_by_principal(input_principal)
27 .cloned()
28 .ok_or_else(|| CatalogError::UnknownSubnet {
29 subnet_principal: input_principal.to_string(),
30 })?;
31 Ok(ResolvedSubnet {
32 input_principal: input_principal.to_string(),
33 resolved_as: ResolvedSubnetSubject::Subnet,
34 resolved_from: "subnet_principal".to_string(),
35 subnet,
36 matched_canister_principal: None,
37 matched_routing_range: None,
38 })
39 }
40}