use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct GenerateItemsAction {
pub from_var: String,
pub json_path: String,
pub mapping: DynamicItemMapping,
#[serde(default)]
pub replace: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DynamicItemMapping {
pub item_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default)]
pub vars: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct NewDynamicItem {
pub item_id: String,
pub label: Option<String>,
pub vars: HashMap<String, String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_items_action_minimal() {
let json = r#"{
"from_var": "candidates",
"json_path": "$.items",
"mapping": {"item_id": "$.id"}
}"#;
let action: GenerateItemsAction =
serde_json::from_str(json).expect("deserialize generate items");
assert_eq!(action.from_var, "candidates");
assert!(!action.replace);
assert!(action.mapping.label.is_none());
assert!(action.mapping.vars.is_empty());
}
#[test]
fn test_generate_items_action_full() {
let json = r#"{
"from_var": "candidates",
"json_path": "$.items",
"mapping": {
"item_id": "$.id",
"label": "$.name",
"vars": {
"approach": "$.approach",
"config": "$.config_path"
}
},
"replace": true
}"#;
let action: GenerateItemsAction =
serde_json::from_str(json).expect("deserialize full generate items");
assert!(action.replace);
assert_eq!(action.mapping.label, Some("$.name".to_string()));
assert_eq!(action.mapping.vars.len(), 2);
}
}