The subnet ID is the same as the root key, for local dfx. In Rust I wrote the conversion as:
/// Gets the subnet ID
#[context("Failed to determine subnet ID.")]
async fn get_subnet_id(agent: &Agent) -> anyhow::Result<Principal> {
let root_key = agent
.status()
.await
.with_context(|| "Could not get agent status")?
.root_key
.with_context(|| "Agent should have fetched the root key.")?;
Ok(Principal::self_authenticating(root_key))
}