mod builder;
pub use builder::Builder;
use crate::{
Balancer,
Envelope,
Error,
Registry,
Reply,
Result,
};
pub struct Router {
registry: Registry,
balancer: Balancer,
}
impl Router {
pub fn builder() -> Builder { Builder::default() }
pub fn route(&mut self, msg: Envelope) -> Result<Reply> {
let instances = self
.registry
.get(
msg.destination()
.to_string()
.as_str(),
)
.ok_or(Error::ServiceNotFound)?;
let service = self
.balancer
.select(instances)?;
service.process(msg)
}
pub fn registry(&self) -> &Registry { &self.registry }
pub fn balancing_strategy(&self) -> &str { self.balancer.strategy() }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn build_default_router() {
let router = Router::builder().build();
let list = router.registry.list();
assert_eq!(router.balancer.strategy(), "round_robin");
assert!(list.is_empty());
}
#[test]
fn build_router_with_balancer() {
let strategy = "least_connections";
let router = Router::builder()
.balancer(strategy)
.build();
let list = router.registry.list();
assert_eq!(router.balancer.strategy(), strategy);
assert!(list.is_empty());
}
#[test]
fn build_router_with_registry() {
let registry = Registry::builder().build();
let router = Router::builder()
.registry(registry)
.build();
let list = router.registry.list();
assert!(list.is_empty());
assert_eq!(router.balancer.strategy(), "round_robin");
}
}