greentic_component/store/
compat.rs

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