1use std::collections::{BTreeMap, BTreeSet};
2
3use semver::Version;
4use serde::{Deserialize, Serialize};
5
6use crate::{
7 contracts::{Capability, ExecutionRoute},
8 errors::PackError,
9};
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct VerticalPackManifest {
13 pub pack_id: String,
14 pub domain: String,
15 pub version: String,
16 pub default_route: ExecutionRoute,
17 pub allowed_connectors: BTreeSet<String>,
18 pub granted_capabilities: BTreeSet<Capability>,
19 pub metadata: BTreeMap<String, String>,
20}
21
22impl VerticalPackManifest {
23 pub fn validate(&self) -> Result<(), PackError> {
24 if self.pack_id.trim().is_empty() {
25 return Err(PackError::EmptyPackId);
26 }
27 if self.domain.trim().is_empty() {
28 return Err(PackError::EmptyDomain);
29 }
30 Version::parse(&self.version)
31 .map_err(|_err| PackError::InvalidVersion(self.version.clone()))?;
32 if self.granted_capabilities.is_empty() {
33 return Err(PackError::EmptyCapabilities);
34 }
35 Ok(())
36 }
37
38 pub fn grants(&self, capability: Capability) -> bool {
39 self.granted_capabilities.contains(&capability)
40 }
41
42 pub fn allows_connector(&self, connector_name: &str) -> bool {
43 self.allowed_connectors.contains(connector_name)
44 }
45}