diff --git a/src/lib.rs b/src/lib.rs index d9a5b93..84a8260 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,12 +115,21 @@ impl Vet for Option { fn is_valid(&self) -> Result<(), Self::VetError> { match self { - Some(t) => t.is_valid(), + Some(o) => o.is_valid(), None => Ok(()), } } } +impl Valid> { + pub fn transpose(self) -> Option> { + match self { + Valid(Some(o)) => Some(Valid(o)), + Valid(None) => None, + } + } +} + #[cfg(feature = "alloc")] impl Vet for alloc::vec::Vec { type VetError = T::VetError; diff --git a/src/tests.rs b/src/tests.rs index a488b71..2fa162c 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -50,6 +50,15 @@ fn vet_option() { assert!(foo.is_valid().is_err()); } +#[test] +fn transpose_valid_option() { + let foo = None::.vet().unwrap(); + assert_eq!(foo.transpose(), None); + + let foo = Some(EvenUsize(84)).vet().unwrap(); + assert_eq!(foo.transpose(), Some(Valid(EvenUsize(84)))); +} + #[test] #[cfg(feature = "alloc")] fn vet_vec() {