diff --git a/bounded-collections/src/bounded_vec.rs b/bounded-collections/src/bounded_vec.rs index 33cce782..64b9b9e1 100644 --- a/bounded-collections/src/bounded_vec.rs +++ b/bounded-collections/src/bounded_vec.rs @@ -265,6 +265,14 @@ impl<'a, T, S: Get> BoundedSlice<'a, T, S> { pub fn truncate_from(s: &'a [T]) -> Self { Self(&s[0..(s.len().min(S::get() as usize))], PhantomData) } + + /// Copies `self` into a new `BoundedVec`. + pub fn to_bounded_vec(self) -> BoundedVec + where + T: Clone, + { + BoundedVec(self.0.to_vec(), PhantomData) + } } impl BoundedVec { @@ -685,6 +693,19 @@ impl> TryFrom> for BoundedVec { } } +impl<'a, T: Clone, S: Get> TryFrom<&'a [T]> for BoundedVec { + type Error = (); + + fn try_from(t: &'a [T]) -> Result { + if t.len() <= Self::bound() { + // explicit check just above + Ok(Self::unchecked_from(t.to_vec())) + } else { + Err(()) + } + } +} + impl> TruncateFrom> for BoundedVec { fn truncate_from(unbound: Vec) -> Self { BoundedVec::::truncate_from(unbound)