use super::super::{yaml_parser::v1, CircuitTemplateError};
use super::{get_argument_value, is_arg_value, RuleArgument, Value};
pub(super) struct SetMetadata {
metadata: Metadata,
}
impl SetMetadata {
pub fn apply_rule(
&self,
template_arguments: &[RuleArgument],
) -> Result<Vec<u8>, CircuitTemplateError> {
match &self.metadata {
Metadata::Json { metadata } => {
let metadata = metadata
.iter()
.map(|metadata| match &metadata.value {
Value::Single(value) => {
let value = if is_arg_value(value) {
get_argument_value(value, template_arguments)?
} else {
value.to_string()
};
Ok(format!("\"{}\":\"{}\"", metadata.key, value))
}
Value::List(values) => {
let processed_values = values
.iter()
.map(|value| {
let value = if is_arg_value(value) {
get_argument_value(value, template_arguments)?
} else {
value.to_string()
};
Ok(format!("\"{}\"", value))
})
.collect::<Result<Vec<String>, CircuitTemplateError>>()?;
Ok(format!(
"\"{}\":[{}]",
metadata.key,
processed_values.join(",")
))
}
})
.collect::<Result<Vec<String>, CircuitTemplateError>>()?;
let json_metadata = format!("{{{}}}", metadata.join(","));
Ok(json_metadata.as_bytes().to_vec())
}
}
}
}
impl From<v1::SetMetadata> for SetMetadata {
fn from(set_metadata: v1::SetMetadata) -> Self {
SetMetadata {
metadata: Metadata::from(set_metadata.metadata().clone()),
}
}
}
pub(super) enum Metadata {
Json { metadata: Vec<JsonMetadata> },
}
impl From<v1::Metadata> for Metadata {
fn from(metadata: v1::Metadata) -> Self {
match metadata {
v1::Metadata::Json { metadata } => Metadata::Json {
metadata: metadata.into_iter().map(JsonMetadata::from).collect(),
},
}
}
}
pub(super) struct JsonMetadata {
key: String,
value: Value,
}
impl From<v1::JsonMetadata> for JsonMetadata {
fn from(metadata: v1::JsonMetadata) -> Self {
JsonMetadata {
key: metadata.key().to_string(),
value: Value::from(metadata.value().clone()),
}
}
}