greentic-operator 0.4.43

Greentic operator CLI for local dev and demo orchestration.
Documentation
use std::path::Path;

use crate::discovery;
use crate::domains::{self, Domain};

pub struct ProviderComponent {
    pub provider_id: String,
    pub pack: domains::ProviderPack,
}

pub fn resolve_provider_component(
    bundle: &Path,
    provider: &str,
) -> anyhow::Result<ProviderComponent> {
    domains::ensure_cbor_packs(bundle)?;
    let discovery =
        discovery::discover_with_options(bundle, discovery::DiscoveryOptions { cbor_only: true })?;
    let packs = domains::discover_provider_packs(bundle, Domain::Messaging)?;
    for pack in packs {
        if pack.pack_id == provider || pack.file_name == format!("{provider}.gtpack") {
            return Ok(ProviderComponent {
                provider_id: provider.to_string(),
                pack,
            });
        }
        let provider_map = discovery
            .providers
            .iter()
            .find(|entry| entry.pack_path == pack.path);
        if let Some(map_entry) = provider_map
            && map_entry.provider_id == provider
        {
            return Ok(ProviderComponent {
                provider_id: map_entry.provider_id.clone(),
                pack,
            });
        }
    }
    Err(anyhow::anyhow!("provider pack not found for {}", provider))
}