diff --git a/modules/src/core/ics05_port/capabilities.rs b/modules/src/core/ics05_port/capabilities.rs index 6a137ce887..8495508e3a 100644 --- a/modules/src/core/ics05_port/capabilities.rs +++ b/modules/src/core/ics05_port/capabilities.rs @@ -92,6 +92,11 @@ impl CapabilityName { Err(InvalidCapabilityName) } } + + pub(crate) fn prefixed_with(&self, mut prefix: String) -> Self { + prefix.push_str(&self.0); + Self(prefix) + } } impl fmt::Display for CapabilityName { diff --git a/modules/src/core/ics05_port/context.rs b/modules/src/core/ics05_port/context.rs index 173df9f683..80dc6030f3 100644 --- a/modules/src/core/ics05_port/context.rs +++ b/modules/src/core/ics05_port/context.rs @@ -101,3 +101,56 @@ fn port_capability_name(port_id: PortId) -> CapabilityName { .parse() .expect("PortsPath cannot be empty string") } + +pub struct ScopedCapabilityReader { + capability_reader: CR, + module_id: M, +} + +impl CapabilityReader for ScopedCapabilityReader { + fn lookup_module(&self, name: &CapabilityName) -> Result<(ModuleId, Capability), Error> { + self.capability_reader + .lookup_module(&name.prefixed_with(self.module_id.to_string())) + } + + fn get_capability(&self, name: &CapabilityName) -> Result { + self.capability_reader + .get_capability(&name.prefixed_with(self.module_id.to_string())) + } + + fn authenticate_capability( + &self, + name: &CapabilityName, + capability: &Capability, + ) -> Result<(), Error> { + self.capability_reader + .authenticate_capability(&name.prefixed_with(self.module_id.to_string()), capability) + } + + fn create_capability(&self, name: CapabilityName) -> Result { + self.capability_reader + .create_capability(name.prefixed_with(self.module_id.to_string())) + } +} + +pub struct ScopedCapabilityKeeper { + capability_keeper: CK, + module_id: M, +} + +impl CapabilityKeeper for ScopedCapabilityKeeper { + fn new_capability(&mut self, name: CapabilityName) -> Result { + self.capability_keeper + .new_capability(name.prefixed_with(self.module_id.to_string())) + } + + fn claim_capability(&mut self, name: CapabilityName, capability: Capability) { + self.capability_keeper + .claim_capability(name.prefixed_with(self.module_id.to_string()), capability) + } + + fn release_capability(&mut self, name: CapabilityName, capability: Capability) { + self.capability_keeper + .release_capability(name.prefixed_with(self.module_id.to_string()), capability) + } +}