use crate::figma_schema;
use dc_bundle::{
definition::NodeQuery,
reaction::{action::Action_type, Reaction},
};
use std::collections::{HashMap, HashSet};
pub struct ComponentContext {
converted_nodes: HashSet<String>,
referenced_nodes: HashSet<String>,
missing_nodes: HashSet<String>,
}
impl ComponentContext {
pub fn new(nodes: &Vec<(NodeQuery, &figma_schema::Node)>) -> ComponentContext {
let mut converted_nodes = HashSet::new();
for (_, node) in nodes {
converted_nodes.insert(node.id.clone());
}
ComponentContext {
converted_nodes,
referenced_nodes: HashSet::new(),
missing_nodes: HashSet::new(),
}
}
pub fn add_destination_nodes(&mut self, reactions: &Vec<Reaction>) {
for reaction in reactions {
if let Some(Action_type::Node(node)) =
reaction.action.as_ref().and_then(|a| a.action_type.as_ref())
{
if let Some(destination_node_id) = &node.destination_id {
if !self.converted_nodes.contains(destination_node_id) {
self.referenced_nodes.insert(destination_node_id.clone());
}
}
}
}
}
pub fn add_component_info(&mut self, component_id: &String) {
if self.converted_nodes.contains(component_id) {
return;
}
self.referenced_nodes.insert(component_id.clone());
}
pub fn referenced_list<'a>(
&mut self,
id_index: &HashMap<String, &'a figma_schema::Node>,
) -> Vec<(NodeQuery, &'a figma_schema::Node)> {
let mut list = Vec::new();
for node_id in self.referenced_nodes.drain() {
if let Some(node) = id_index.get(&node_id) {
list.push((NodeQuery::NodeId(node_id.clone()), *node));
self.converted_nodes.insert(node_id);
} else {
self.missing_nodes.insert(node_id);
}
}
list
}
pub fn missing_nodes(&self) -> &HashSet<String> {
&self.missing_nodes
}
}