use crate::{
domain::policy::pool::{PoolPolicyError, admissibility::policy_can_enter_pool},
ids::BuildNetwork,
ops::{
ic::{mgmt::MgmtOps, network::NetworkOps},
storage::registry::subnet::SubnetRegistryOps,
},
workflow::prelude::*,
};
#[inline]
fn is_local_build() -> bool {
NetworkOps::build_network() == Some(BuildNetwork::Local)
}
async fn probe_importable_on_local(pid: Principal) -> Result<(), String> {
if !is_local_build() {
return Ok(());
}
match MgmtOps::canister_status(pid).await {
Ok(_) => Ok(()),
Err(err) => Err(err.to_string()),
}
}
pub async fn check_can_enter_pool(pid: Principal) -> Result<(), PoolPolicyError> {
let registered_in_subnet = SubnetRegistryOps::get(pid).is_some();
let importable_on_local = probe_importable_on_local(pid).await;
policy_can_enter_pool(pid, registered_in_subnet, importable_on_local)
}