use std::collections::HashMap;
use crate::view::NodeId;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub(crate) enum NodeAddress {
Root,
RuleSet { rule_set: usize },
Rule { rule_set: usize, rule: usize },
Respond { rule_set: usize, rule: usize },
Middleware { middleware: usize },
FallbackRespondDir,
HeaderCondition { rule_set: usize, rule: usize, header_name: String },
BodyCondition { rule_set: usize, rule: usize, path: String },
}
#[derive(Default)]
pub(crate) struct IdIndex {
pub(super) id_to_address: HashMap<NodeId, NodeAddress>,
pub(super) address_to_id: HashMap<NodeAddress, NodeId>,
}
impl IdIndex {
pub(super) fn insert(&mut self, address: NodeAddress) -> NodeId {
if let Some(&id) = self.address_to_id.get(&address) {
return id;
}
let id = NodeId::new();
self.id_to_address.insert(id, address.clone());
self.address_to_id.insert(address, id);
id
}
pub(super) fn lookup(&self, id: NodeId) -> Option<NodeAddress> {
self.id_to_address.get(&id).cloned()
}
pub(super) fn id_for(&self, address: NodeAddress) -> Option<NodeId> {
self.address_to_id.get(&address).copied()
}
}