tap_node/message/
router.rs1use log::debug;
6use std::sync::Arc;
7use tap_msg::didcomm::Message;
8
9use crate::agent::AgentRegistry;
10use crate::error::{Error, Result};
11use crate::message::MessageRouter;
12
13#[derive(Debug, Clone)]
15pub struct DefaultMessageRouter {
16 agents: Option<Arc<AgentRegistry>>,
18}
19
20impl Default for DefaultMessageRouter {
21 fn default() -> Self {
22 Self::new()
23 }
24}
25
26impl DefaultMessageRouter {
27 pub fn new() -> Self {
29 Self { agents: None }
30 }
31
32 pub fn with_agents(mut self, agents: Arc<AgentRegistry>) -> Self {
34 self.agents = Some(agents);
35 self
36 }
37}
38
39impl MessageRouter for DefaultMessageRouter {
40 fn route_message_impl(&self, message: &Message) -> Result<String> {
41 if let Some(to) = &message.to {
43 if !to.is_empty() {
44 let to_did = to[0].clone();
46
47 if let Some(agents) = &self.agents {
49 if agents.has_agent(&to_did) {
50 debug!("Routing message to: {}", to_did);
51 return Ok(to_did);
52 }
53 } else {
54 debug!("No agent registry available, routing to: {}", to_did);
56 return Ok(to_did);
57 }
58 }
59 }
60
61 Err(Error::Dispatch(format!(
63 "No route found for message: {}",
64 message.id
65 )))
66 }
67}
68
69#[derive(Debug, Default)]
71pub struct CompositeMessageRouter {
72 routers: Vec<crate::message::MessageRouterType>,
74}
75
76impl CompositeMessageRouter {
77 pub fn new() -> Self {
79 Self::default()
80 }
81
82 pub fn add_router(&mut self, router: crate::message::MessageRouterType) {
84 self.routers.push(router);
85 }
86}
87
88impl MessageRouter for CompositeMessageRouter {
89 fn route_message_impl(&self, message: &Message) -> Result<String> {
90 for router in &self.routers {
92 match router {
93 crate::message::MessageRouterType::Default(r) => {
94 match r.route_message_impl(message) {
95 Ok(target) => return Ok(target),
96 Err(_) => continue, }
98 } }
100 }
101
102 Err(Error::Dispatch(format!(
104 "No route found for message: {}",
105 message.id
106 )))
107 }
108}