Skip to main content

runx_runtime/effects/
metadata.rs

1use runx_contracts::{JsonObject, Reference};
2use serde::{Deserialize, Serialize};
3
4use super::RuntimeEffectError;
5
6pub const EFFECT_VERIFICATION_REFS_METADATA: &str = "runx_effect_verification_refs";
7
8#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(deny_unknown_fields)]
10struct EffectVerificationRefsMetadata {
11    refs: Vec<Reference>,
12}
13
14pub fn insert_effect_verification_ref(
15    metadata: &mut JsonObject,
16    reference: Reference,
17) -> Result<(), RuntimeEffectError> {
18    let mut refs = effect_verification_refs(metadata)?;
19    refs.push(reference);
20    let value = serde_json::to_value(EffectVerificationRefsMetadata { refs })
21        .and_then(serde_json::from_value)
22        .map_err(|source| RuntimeEffectError::InvalidMetadata {
23            family: "runtime".to_owned(),
24            message: source.to_string(),
25        })?;
26    metadata.insert(EFFECT_VERIFICATION_REFS_METADATA.to_owned(), value);
27    Ok(())
28}
29
30pub(crate) fn effect_verification_refs(
31    metadata: &JsonObject,
32) -> Result<Vec<Reference>, RuntimeEffectError> {
33    let Some(value) = metadata.get(EFFECT_VERIFICATION_REFS_METADATA) else {
34        return Ok(Vec::new());
35    };
36    let refs = serde_json::to_value(value)
37        .and_then(serde_json::from_value::<EffectVerificationRefsMetadata>)
38        .map_err(|source| RuntimeEffectError::InvalidMetadata {
39            family: "runtime".to_owned(),
40            message: source.to_string(),
41        })?;
42    Ok(refs.refs)
43}