greentic_operator/messaging_universal/
provider.rs1use 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}