use crate::cluster_options::ClusterOptions;
use crate::local_host::LocalHost;
use crate::memory_store::MemoryStore;
use crate::node::Node;
use ckey::CKey;
use std::collections::HashMap;
use std::hash::Hash;
use url::ParseError;
#[derive(Debug)]
pub struct Cluster<C, V>
where
C: Eq + Hash + Clone,
V: Clone,
{
pub local_host: LocalHost,
nodes: HashMap<CKey, Node>,
store: MemoryStore<C, V>,
}
impl<C, V> Cluster<C, V>
where
C: Eq + Hash + Clone,
V: Clone,
{
pub fn new(options: Option<ClusterOptions>) -> Result<Cluster<C, V>, ParseError> {
let real_options = options.unwrap_or(ClusterOptions::default());
let local_host = LocalHost::new(Some(real_options.local_host))?;
let mut cluster = Cluster {
local_host,
nodes: HashMap::new(),
store: MemoryStore::new(),
};
cluster.resize(real_options.size);
Ok(cluster)
}
pub fn resize(&mut self, size: usize) {
while self.nodes.len() > size {
let to_remove = self.nodes.iter().next().unwrap().0.clone();
self.nodes.remove(&to_remove);
}
while self.nodes.len() < size {
let node = Node::new_rand();
match self.nodes.insert(node.key, node) {
Some(_) => panic!("duplicate node key"),
None => {}
}
}
}
pub fn store(&self) -> &MemoryStore<C, V> {
&self.store
}
}