use crate::{Mut, Ref, RefKind};
use super::{MoveError, Result};
pub trait MoveMut<'owner> {
type Mut: 'owner;
fn move_mut(&mut self) -> Result<Self::Mut>;
}
impl<'owner, T> MoveMut<'owner> for Option<&'owner mut T>
where
T: ?Sized,
{
type Mut = &'owner mut T;
fn move_mut(&mut self) -> Result<Self::Mut> {
let unique = self.take().ok_or(MoveError::BorrowedMutably)?;
Ok(unique)
}
}
impl<'owner, T> MoveMut<'owner> for Option<RefKind<'owner, T>>
where
T: ?Sized,
{
type Mut = &'owner mut T;
fn move_mut(&mut self) -> Result<Self::Mut> {
let kind = self.take().ok_or(MoveError::BorrowedMutably)?;
let unique = match kind {
Ref(shared) => {
*self = Some(Ref(shared));
return Err(MoveError::BorrowedImmutably);
}
Mut(unique) => unique,
};
Ok(unique)
}
}