use crate::protocol::ids::{GraphVersion, Lane, RegionId};
pub const REQUEST_PREFIX: &str = "solve.req.v1";
pub fn request_subject(graph: &GraphVersion, region: &RegionId, lane: Lane) -> String {
format!("{REQUEST_PREFIX}.g.{graph}.r.{region}.q.{}", lane.0)
}
pub fn request_queue_filter(graph: &GraphVersion, region: &RegionId) -> String {
format!("{REQUEST_PREFIX}.g.{graph}.r.{region}.q.*")
}
pub fn sticky_subject(graph: &GraphVersion, region: &RegionId, replica: &str) -> String {
format!("{REQUEST_PREFIX}.g.{graph}.r.{region}.m.{replica}")
}
pub fn reply_subject(prefix: &str, partition: u16) -> String {
format!("{prefix}.p.{partition}")
}
pub fn reply_filter(prefix: &str) -> String {
format!("{prefix}.p.*")
}
#[cfg(test)]
mod tests {
use super::*;
use crate::topology::partition_of_subject;
fn graph() -> GraphVersion {
GraphVersion::new("g1").unwrap()
}
fn region() -> RegionId {
RegionId::new("syd").unwrap()
}
#[test]
fn request_subjects_share_the_queue_filter_but_not_the_replica_subject() {
let queued = request_subject(&graph(), ®ion(), Lane(2));
assert_eq!(queued, "solve.req.v1.g.g1.r.syd.q.2");
assert_eq!(
request_queue_filter(&graph(), ®ion()),
"solve.req.v1.g.g1.r.syd.q.*"
);
assert_eq!(
sticky_subject(&graph(), ®ion(), "abc"),
"solve.req.v1.g.g1.r.syd.m.abc"
);
}
#[test]
fn reply_subjects_address_a_partition() {
let subject = reply_subject("_INBOX.owner", 485);
assert_eq!(subject, "_INBOX.owner.p.485");
assert_eq!(partition_of_subject(&subject), Some(485));
assert_eq!(reply_filter("_INBOX.owner"), "_INBOX.owner.p.*");
}
}