Skip to main content

ic_query/subnet_catalog/resolver/
subnet.rs

1use super::{ResolveAs, ResolvedSubnet, ResolvedSubnetSubject};
2use crate::subnet_catalog::{CatalogError, SubnetCatalog, canonical_principal_text};
3
4impl SubnetCatalog {
5    /// Resolve a principal as a known subnet or as a canister covered by a cached range.
6    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}