pub trait RestrictAccess<To>: Access {
type Restricted: Access;
}
impl<To: Access> RestrictAccess<To> for ReadWrite {
type Restricted = To;
}
impl<To> RestrictAccess<To> for NoAccess {
type Restricted = Self;
}
macro_rules! restrict_impl {
($SelfT:ty, $To:ty, $Restricted:ty) => {
impl RestrictAccess<$To> for $SelfT {
type Restricted = $Restricted;
}
};
}
restrict_impl!(ReadOnly, ReadWrite, ReadOnly);
restrict_impl!(ReadOnly, ReadOnly, ReadOnly);
restrict_impl!(ReadOnly, WriteOnly, NoAccess);
restrict_impl!(ReadOnly, NoAccess, NoAccess);
restrict_impl!(WriteOnly, ReadWrite, WriteOnly);
restrict_impl!(WriteOnly, ReadOnly, NoAccess);
restrict_impl!(WriteOnly, WriteOnly, WriteOnly);
restrict_impl!(WriteOnly, NoAccess, NoAccess);
pub trait Access: Copy + Default + private::Sealed {}
pub trait Readable: Access {}
impl<A: RestrictAccess<ReadOnly, Restricted = ReadOnly>> Readable for A {}
pub trait Writable: Access {}
impl<A: RestrictAccess<WriteOnly, Restricted = WriteOnly>> Writable for A {}
pub trait Copyable: Access {}
impl<A: RestrictAccess<ReadOnly, Restricted = Self>> Copyable for A {}
#[derive(Debug, Default, Copy, Clone)]
pub struct ReadWrite;
impl Access for ReadWrite {}
#[derive(Debug, Default, Copy, Clone)]
pub struct ReadOnly;
impl Access for ReadOnly {}
#[derive(Debug, Default, Copy, Clone)]
pub struct WriteOnly;
impl Access for WriteOnly {}
#[derive(Debug, Default, Copy, Clone)]
pub struct NoAccess;
impl Access for NoAccess {}
mod private {
pub trait Sealed {}
impl Sealed for super::ReadWrite {}
impl Sealed for super::ReadOnly {}
impl Sealed for super::WriteOnly {}
impl Sealed for super::NoAccess {}
}