gsm_core/
provider_registry.rs1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::provider_capabilities::ProviderCapabilitiesV1;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum CapsSource {
10 FromProviderCall,
11 FromPackManifest,
12 Override,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
16pub struct ProviderRecord {
17 pub id: String,
18 pub version: String,
19 pub caps_source: CapsSource,
20 pub capabilities: ProviderCapabilitiesV1,
21 #[serde(default)]
22 pub encoder_ref: Option<String>,
23}
24
25#[derive(Default)]
26pub struct ProviderCapsRegistry {
27 providers: HashMap<String, ProviderRecord>,
28}
29
30impl ProviderCapsRegistry {
31 #[allow(clippy::new_without_default)]
32 pub fn new() -> Self {
33 Self {
34 providers: HashMap::new(),
35 }
36 }
37
38 pub fn register_provider(
39 &mut self,
40 id: impl Into<String>,
41 version: impl Into<String>,
42 caps_source: CapsSource,
43 capabilities: ProviderCapabilitiesV1,
44 encoder_ref: Option<String>,
45 ) {
46 let id = id.into();
47 let record = ProviderRecord {
48 id: id.clone(),
49 version: version.into(),
50 caps_source,
51 capabilities,
52 encoder_ref,
53 };
54 self.providers.insert(id, record);
55 }
56
57 pub fn get_caps(&self, provider_id: &str) -> Option<&ProviderCapabilitiesV1> {
58 self.providers.get(provider_id).map(|p| &p.capabilities)
59 }
60
61 pub fn get(&self, provider_id: &str) -> Option<&ProviderRecord> {
62 self.providers.get(provider_id)
63 }
64}