diff --git a/src/base/name/relative.rs b/src/base/name/relative.rs index 5761e4a7..75b95fdb 100644 --- a/src/base/name/relative.rs +++ b/src/base/name/relative.rs @@ -13,7 +13,7 @@ use bytes::Bytes; use core::cmp::Ordering; use core::ops::{Bound, RangeBounds}; use core::str::FromStr; -use core::{cmp, fmt, hash}; +use core::{borrow, cmp, fmt, hash}; use octseq::builder::{ EmptyBuilder, FreezeBuilder, FromBuilder, IntoBuilder, Truncate, }; @@ -741,6 +741,45 @@ impl + ?Sized> fmt::Debug for RelativeDname { } } +//--- AsRef and Borrow + +impl AsRef> for RelativeDname +where + Octs: AsRef<[u8]> + ?Sized, +{ + fn as_ref(&self) -> &RelativeDname<[u8]> { + self.for_slice() + } +} + +/// Borrow a relative domain name. +/// +/// Containers holding an owned `RelativeDname<_>` may be queried with name +/// over a slice. This `Borrow<_>` impl supports user code querying containers +/// with compatible-but-different types like the following example: +/// +/// ``` +/// use std::collections::HashMap; +/// +/// use domain::base::RelativeDname; +/// +/// fn get_description( +/// hash: &HashMap>, String> +/// ) -> Option<&str> { +/// let lookup_name: &RelativeDname<[u8]> = +/// RelativeDname::from_slice(b"\x03ftp").unwrap(); +/// hash.get(lookup_name).map(|x| x.as_ref()) +/// } +/// ``` +impl borrow::Borrow> for RelativeDname +where + Octs: AsRef<[u8]>, +{ + fn borrow(&self) -> &RelativeDname<[u8]> { + self.for_slice() + } +} + //--- Serialize and Deserialize #[cfg(feature = "serde")]