Skip to main content

gsm_core/
provider_registry.rs

1use 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}