greentic_component/store/
compat.rs1use super::MetaInfo;
2use thiserror::Error;
3
4#[derive(Clone, Debug, Default)]
5pub struct CompatPolicy {
6 pub required_abi_prefix: String,
7 pub required_capabilities: Vec<String>,
8}
9
10#[derive(Debug, Error)]
11pub enum CompatError {
12 #[error("ABI mismatch: required prefix '{required}', got '{got}'")]
13 AbiMismatch { required: String, got: String },
14 #[error("Missing capabilities: {0:?}")]
15 MissingCapabilities(Vec<String>),
16}
17
18pub fn check(policy: &CompatPolicy, meta: &MetaInfo) -> Result<(), CompatError> {
19 if !policy.required_abi_prefix.is_empty()
20 && !meta.abi_version.starts_with(&policy.required_abi_prefix)
21 {
22 return Err(CompatError::AbiMismatch {
23 required: policy.required_abi_prefix.clone(),
24 got: meta.abi_version.clone(),
25 });
26 }
27
28 if !policy.required_capabilities.is_empty() {
29 let mut missing = Vec::new();
30 for capability in &policy.required_capabilities {
31 if !meta.capabilities.iter().any(|c| c == capability) {
32 missing.push(capability.clone());
33 }
34 }
35 if !missing.is_empty() {
36 return Err(CompatError::MissingCapabilities(missing));
37 }
38 }
39
40 Ok(())
41}