greentic_component/store/
meta.rs

1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3use sha2::{Digest, Sha256};
4
5use super::ComponentId;
6
7#[derive(Clone, Debug, Serialize, Deserialize)]
8pub struct MetaInfo {
9    pub id: ComponentId,
10    pub size: u64,
11    pub abi_version: String,
12    pub provider_name: Option<String>,
13    pub provider_version: Option<String>,
14    pub capabilities: Vec<String>,
15}
16
17pub async fn compute_id_and_meta(bytes: &[u8]) -> Result<(ComponentId, MetaInfo)> {
18    let mut hasher = Sha256::new();
19    hasher.update(bytes);
20    let digest = hex::encode(hasher.finalize());
21    let id = ComponentId(format!("sha256:{digest}"));
22
23    let size = bytes.len() as u64;
24
25    // TODO: hook into greentic-interfaces once ABI metadata extraction is stabilised.
26    let meta = MetaInfo {
27        id: id.clone(),
28        size,
29        abi_version: "greentic-abi-0".to_string(),
30        provider_name: None,
31        provider_version: None,
32        capabilities: Vec::new(),
33    };
34
35    Ok((id, meta))
36}