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