Skip to main content

loong_contracts/
pack.rs

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}