palladium_runtime/
federation.rs1use std::sync::Arc;
2
3use palladium_actor::{ActorPath, AddrHash, SendError};
4use palladium_federation::{FederatedRegistry, FederationPolicy};
5use parking_lot::RwLock;
6
7#[derive(Clone)]
8pub struct FederatedRouting {
9 registry: Arc<RwLock<FederatedRegistry>>,
10 policy: Arc<RwLock<FederationPolicy>>,
11}
12
13impl FederatedRouting {
14 pub fn new(registry: Arc<RwLock<FederatedRegistry>>, policy: FederationPolicy) -> Self {
15 Self {
16 registry,
17 policy: Arc::new(RwLock::new(policy)),
18 }
19 }
20
21 pub fn registry(&self) -> &Arc<RwLock<FederatedRegistry>> {
22 &self.registry
23 }
24
25 pub fn policy(&self) -> Arc<RwLock<FederationPolicy>> {
26 Arc::clone(&self.policy)
27 }
28
29 pub fn resolve(&self, path: &ActorPath) -> Result<AddrHash, SendError> {
30 let policy = self.policy.read();
31 if !policy.allows(path) {
32 return Err(SendError::PolicyViolation);
33 }
34 let registry = self.registry.read();
35 let entry = registry.resolve(path).ok_or(SendError::Unroutable)?;
36 Ok(entry.addr_hash)
37 }
38
39 pub fn resolve_optional(&self, path: &ActorPath) -> Option<AddrHash> {
40 let policy = self.policy.read();
41 if !policy.allows(path) {
42 return None;
43 }
44 let registry = self.registry.read();
45 registry.resolve(path).map(|entry| entry.addr_hash)
46 }
47}