Skip to main content

appcore_provider/
plan.rs

1// =============================================================================
2//        #######
3//     ###       ###     F: plan.rs
4//    ##   ## ##   ##    P: AppCore-Runtime
5//         ## ##
6//                       C: 2026/07/22 15:41:18 by dnettoRaw
7//    ##   ## ##   ##    U: 2026/07/23 10:59:21 by dnettoRaw
8//      ###########      S: 1.0.1-rc.8
9// =============================================================================
10
11use crate::ProviderContext;
12use appcore_contracts::{DeploymentManifestV1, ProviderConfig, ProviderId};
13use std::collections::BTreeMap;
14
15/// Immutable provider selections extracted from a deployment manifest.
16#[derive(Debug, Clone, PartialEq, Eq)]
17pub struct DeploymentProviderPlan {
18    context: ProviderContext,
19    storage: ProviderConfig,
20    control_plane: Option<ProviderConfig>,
21    coordination_store: Option<ProviderConfig>,
22    secret_provider: Option<ProviderConfig>,
23    job_provider: Option<ProviderConfig>,
24    peer_discovery: Option<ProviderConfig>,
25    update: Option<ProviderConfig>,
26    database: Option<ProviderConfig>,
27    peer_transport: ProviderId,
28    command_transport: ProviderId,
29    adapters: BTreeMap<String, ProviderConfig>,
30}
31
32impl DeploymentProviderPlan {
33    /// Extracts all provider ownership from a validated deployment manifest.
34    pub fn from_manifest(manifest: &DeploymentManifestV1) -> Self {
35        Self {
36            context: ProviderContext::from_manifest(manifest),
37            storage: manifest.storage().clone(),
38            control_plane: manifest.control_plane().cloned(),
39            coordination_store: manifest.coordination_store().cloned(),
40            secret_provider: manifest.secret_provider().cloned(),
41            job_provider: manifest.job_provider().cloned(),
42            peer_discovery: manifest.peer_discovery().cloned(),
43            update: manifest.update_provider().cloned(),
44            database: manifest.database().cloned(),
45            peer_transport: manifest.network().peer_transport().clone(),
46            command_transport: manifest.network().command_transport().clone(),
47            adapters: manifest.adapters().clone(),
48        }
49    }
50
51    /// Returns common factory context.
52    pub fn context(&self) -> &ProviderContext {
53        &self.context
54    }
55
56    /// Returns the selected storage provider.
57    pub fn storage(&self) -> &ProviderConfig {
58        &self.storage
59    }
60
61    /// Returns the selected control-plane provider.
62    pub fn control_plane(&self) -> Option<&ProviderConfig> {
63        self.control_plane.as_ref()
64    }
65
66    /// Returns the selected coordination-store provider.
67    pub fn coordination_store(&self) -> Option<&ProviderConfig> {
68        self.coordination_store.as_ref()
69    }
70
71    /// Returns the selected installation secret provider.
72    pub fn secret_provider(&self) -> Option<&ProviderConfig> {
73        self.secret_provider.as_ref()
74    }
75
76    /// Returns the selected durable job provider.
77    pub fn job_provider(&self) -> Option<&ProviderConfig> {
78        self.job_provider.as_ref()
79    }
80
81    /// Returns the selected peer-discovery provider.
82    pub fn peer_discovery(&self) -> Option<&ProviderConfig> {
83        self.peer_discovery.as_ref()
84    }
85
86    /// Returns the selected update provider.
87    pub fn update(&self) -> Option<&ProviderConfig> {
88        self.update.as_ref()
89    }
90
91    /// Returns the selected application database provider.
92    pub fn database(&self) -> Option<&ProviderConfig> {
93        self.database.as_ref()
94    }
95
96    /// Returns the direct peer transport provider identity.
97    pub fn peer_transport(&self) -> &ProviderId {
98        &self.peer_transport
99    }
100
101    /// Returns the command transport provider identity.
102    pub fn command_transport(&self) -> &ProviderId {
103        &self.command_transport
104    }
105
106    /// Returns named installation adapters.
107    pub fn adapters(&self) -> &BTreeMap<String, ProviderConfig> {
108        &self.adapters
109    }
110}