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()
}
}