feat(host): resolve published interface references

This commit is contained in:
2026-09-29 00:03:55 +09:00
parent f9f083d4c6
commit d0683f0b6d
2 changed files with 22 additions and 0 deletions
+12
View File
@@ -208,6 +208,18 @@ impl InterfaceRegistry {
}) })
} }
/// Resolves a transport-provided opaque reference string in this registry.
///
/// The returned value is registry-scoped and suitable for observation or a
/// qualified [`CallRequest`]. Unknown or foreign references return `None`;
/// constructing arbitrary `InterfaceRef` values is intentionally not part of
/// the public API.
#[must_use]
pub fn resolve(&self, reference: &str) -> Option<InterfaceRef> {
let reference = InterfaceRef(reference.to_owned());
self.artifacts.contains_key(&reference).then_some(reference)
}
/// Observes the descriptor and optional validator for an opaque reference. /// Observes the descriptor and optional validator for an opaque reference.
#[must_use] #[must_use]
pub fn observe(&self, reference: &InterfaceRef) -> Option<InterfaceObservation> { pub fn observe(&self, reference: &InterfaceRef) -> Option<InterfaceObservation> {
+10
View File
@@ -163,6 +163,11 @@ fn registry_exposes_opaque_validated_descriptor_observations() {
let reader = registry.register(ReaderDefinition, None).unwrap(); let reader = registry.register(ReaderDefinition, None).unwrap();
assert_ne!(reader.reference().as_str(), "Reader"); assert_ne!(reader.reference().as_str(), "Reader");
assert_eq!(
registry.resolve(reader.reference().as_str()).as_ref(),
Some(reader.reference())
);
assert!(registry.resolve("wip-interface:unknown:0").is_none());
let observation = registry.observe(reader.reference()).unwrap(); let observation = registry.observe(reader.reference()).unwrap();
assert_eq!(observation.reference, *reader.reference()); assert_eq!(observation.reference, *reader.reference());
assert_eq!(observation.descriptor.name, reader.reference().as_str()); assert_eq!(observation.descriptor.name, reader.reference().as_str());
@@ -174,6 +179,11 @@ fn registry_exposes_opaque_validated_descriptor_observations() {
let mut other_registry = InterfaceRegistry::new(); let mut other_registry = InterfaceRegistry::new();
let other_reader = other_registry.register(ReaderDefinition, None).unwrap(); let other_reader = other_registry.register(ReaderDefinition, None).unwrap();
assert_ne!(reader.reference(), other_reader.reference()); assert_ne!(reader.reference(), other_reader.reference());
assert!(
registry
.resolve(other_reader.reference().as_str())
.is_none()
);
} }
#[test] #[test]