Skip to main content

palladium_runtime/
federation.rs

1use 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}