use std::collections::HashMap;
use crate::MediaType;
pub(super) enum Item {
Node {
media_type: Option<MediaType>,
},
Port {
node_id: u32,
},
Link {
port_from: u32,
port_to: u32,
},
}
#[derive(Default)]
pub(super) struct State {
items: HashMap<u32, Item>,
links: HashMap<(u32, u32), u32>,
}
impl State {
pub fn new() -> Self {
Default::default()
}
pub fn insert(&mut self, id: u32, item: Item) {
if let Item::Link {
port_from, port_to, ..
} = item
{
self.links.insert((port_from, port_to), id);
}
self.items.insert(id, item);
}
pub fn get(&self, id: u32) -> Option<&Item> {
self.items.get(&id)
}
pub fn get_link_id(&self, output_port: u32, input_port: u32) -> Option<u32> {
self.links.get(&(output_port, input_port)).copied()
}
pub fn remove(&mut self, id: u32) -> Option<Item> {
let removed = self.items.remove(&id);
if let Some(Item::Link { port_from, port_to }) = removed {
self.links.remove(&(port_from, port_to));
}
removed
}
pub fn get_node_of_port(&self, port: u32) -> Option<u32> {
if let Some(Item::Port { node_id }) = self.get(port) {
Some(*node_id)
} else {
None
}
}
}