use indexmap::IndexSet;
use serde::{Deserialize, Serialize};
use tracing::info;
use super::super::types::*;
use crate::types::*;
#[derive(Debug, Serialize, Deserialize)]
pub struct NormalRouter {
pub(super) worker_set: IndexSet<WorkerId>,
pub(super) version: Version,
}
impl NormalRouter {
pub(super) fn new(worker_set: IndexSet<WorkerId>, version: Version) -> Self {
info!("Creating normal router with set {:?}", worker_set);
Self {
worker_set,
version,
}
}
pub(super) fn route_message<K>(&self, key: &K, partitioner: WorkerPartitioner<K>) -> WorkerId {
let target = partitioner(key, &self.worker_set);
debug_assert!(self.worker_set.contains(&target));
target
}
}
#[cfg(test)]
mod test {
use super::*;
use indexmap::IndexSet;
fn partiton_index(i: &usize, s: &IndexSet<WorkerId>) -> WorkerId {
*s.get_index(i % s.len()).unwrap()
}
#[test]
fn give_correct_target() {
let router = NormalRouter::new(IndexSet::from([0, 1]), 0);
assert_eq!(0, router.route_message(&0, partiton_index));
assert_eq!(1, router.route_message(&1, partiton_index));
assert_eq!(1, router.route_message(&555, partiton_index));
}
}