use std::collections::BTreeMap;
use serde_derive::{Deserialize, Serialize};
use crate::circuit::service::SplinterNode;
use crate::circuit::Circuit;
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
pub struct CircuitDirectory {
nodes: BTreeMap<String, SplinterNode>,
circuits: BTreeMap<String, Circuit>,
#[serde(skip_serializing)]
#[serde(default = "Circuit::new_admin")]
admin_circuit: Circuit,
}
impl Default for CircuitDirectory {
fn default() -> Self {
CircuitDirectory::new()
}
}
impl CircuitDirectory {
pub fn new() -> Self {
CircuitDirectory {
nodes: BTreeMap::new(),
circuits: BTreeMap::new(),
admin_circuit: Circuit::new_admin(),
}
}
pub fn add_node(&mut self, id: String, node: SplinterNode) {
self.nodes.insert(id, node);
}
pub fn add_circuit(&mut self, name: String, circuit: Circuit) {
self.circuits.insert(name, circuit);
}
pub fn remove_node(&mut self, id: &str) {
self.nodes.remove(id);
}
pub fn remove_circuit(&mut self, name: &str) {
self.circuits.remove(name);
}
pub fn nodes(&self) -> &BTreeMap<String, SplinterNode> {
&self.nodes
}
pub fn node(&self, node_id: &str) -> Option<&SplinterNode> {
self.nodes.get(node_id)
}
pub fn circuits(&self) -> &BTreeMap<String, Circuit> {
&self.circuits
}
pub fn circuit(&self, circuit_name: &str) -> Option<&Circuit> {
if circuit_name == self.admin_circuit.id() {
Some(&self.admin_circuit)
} else {
self.circuits.get(circuit_name)
}
}
pub fn has_circuit(&self, circuit_name: &str) -> bool {
self.circuits.contains_key(circuit_name)
}
}