Skip to main content

greentic_operator/messaging_universal/
provider.rs

1use std::path::Path;
2
3use crate::discovery;
4use crate::domains::{self, Domain};
5
6pub struct ProviderComponent {
7    pub provider_id: String,
8    pub pack: domains::ProviderPack,
9}
10
11pub fn resolve_provider_component(
12    bundle: &Path,
13    provider: &str,
14) -> anyhow::Result<ProviderComponent> {
15    domains::ensure_cbor_packs(bundle)?;
16    let discovery =
17        discovery::discover_with_options(bundle, discovery::DiscoveryOptions { cbor_only: true })?;
18    let packs = domains::discover_provider_packs(bundle, Domain::Messaging)?;
19    for pack in packs {
20        if pack.pack_id == provider || pack.file_name == format!("{provider}.gtpack") {
21            return Ok(ProviderComponent {
22                provider_id: provider.to_string(),
23                pack,
24            });
25        }
26        let provider_map = discovery
27            .providers
28            .iter()
29            .find(|entry| entry.pack_path == pack.path);
30        if let Some(map_entry) = provider_map
31            && map_entry.provider_id == provider
32        {
33            return Ok(ProviderComponent {
34                provider_id: map_entry.provider_id.clone(),
35                pack,
36            });
37        }
38    }
39    Err(anyhow::anyhow!("provider pack not found for {}", provider))
40}