Diffstat (limited to 'src/walk/walkers/owned.rs')
-rw-r--r--src/walk/walkers/owned.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/walk/walkers/owned.rs b/src/walk/walkers/owned.rs
new file mode 100644
index 0000000..6703625
--- /dev/null
+++ b/src/walk/walkers/owned.rs
@@ -0,0 +1,41 @@
+use crate::{
+ build::protocols,
+ protocol::{Implementer, ImplementerExt, ProtocolExt},
+ Walker,
+};
+
+use super::MissingProtocol;
+
+pub struct OwnedWalker<T> {
+ value: T,
+}
+
+impl<T> OwnedWalker<T> {
+ pub const fn new(value: T) -> Self {
+ Self { value }
+ }
+}
+
+impl<T> From<T> for OwnedWalker<T> {
+ fn from(value: T) -> Self {
+ Self::new(value)
+ }
+}
+
+impl<'ctx, T: 'static> Walker<'ctx> for OwnedWalker<T> {
+ type Error = (MissingProtocol, T);
+
+ type Value = ();
+
+ fn walk(self, visitor: &mut dyn Implementer<'ctx>) -> Result<Self::Value, Self::Error> {
+ if let Some(interface) = visitor.interface_for::<protocols::owned::Owned<T>>() {
+ let _ = interface.as_object().visit(self.value);
+ Ok(())
+ } else {
+ Err((
+ MissingProtocol(protocols::owned::Owned::<T>::id()),
+ self.value,
+ ))
+ }
+ }
+}