pub trait Router: Send + Sync + 'static {
fn route(&self, kind: &str) -> &'static str;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct DefaultRouter;
impl Router for DefaultRouter {
fn route(&self, _kind: &str) -> &'static str {
"default"
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct KindPrefixRouter;
impl Router for KindPrefixRouter {
fn route(&self, kind: &str) -> &'static str {
if kind.starts_with("gh_") {
"gh"
} else if kind.starts_with("slack_") {
"slack"
} else {
"default"
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn routes_gh_prefix_to_gh_queue() {
let r = KindPrefixRouter;
assert_eq!(r.route("gh_issue_refresh"), "gh");
assert_eq!(r.route("gh_board_scan"), "gh");
}
#[test]
fn routes_slack_prefix_to_slack_queue() {
let r = KindPrefixRouter;
assert_eq!(r.route("slack_channel_scan"), "slack");
assert_eq!(r.route("slack_thread_refresh"), "slack");
}
#[test]
fn unknown_prefix_routes_to_default() {
let r = KindPrefixRouter;
assert_eq!(r.route("noop_echo"), "default");
assert_eq!(r.route("tickets_sync"), "default");
assert_eq!(r.route(""), "default");
}
}