1pub trait RestrictAccess<To>: Access {
17 type Restricted: Access;
19}
20
21impl<To: Access> RestrictAccess<To> for ReadWrite {
22 type Restricted = To;
23}
24
25impl<To> RestrictAccess<To> for NoAccess {
26 type Restricted = Self;
27}
28
29macro_rules! restrict_impl {
31 ($SelfT:ty, $To:ty, $Restricted:ty) => {
32 impl RestrictAccess<$To> for $SelfT {
33 type Restricted = $Restricted;
34 }
35 };
36}
37
38restrict_impl!(ReadOnly, ReadWrite, ReadOnly);
39restrict_impl!(ReadOnly, ReadOnly, ReadOnly);
40restrict_impl!(ReadOnly, WriteOnly, NoAccess);
41restrict_impl!(ReadOnly, NoAccess, NoAccess);
42
43restrict_impl!(WriteOnly, ReadWrite, WriteOnly);
44restrict_impl!(WriteOnly, ReadOnly, NoAccess);
45restrict_impl!(WriteOnly, WriteOnly, WriteOnly);
46restrict_impl!(WriteOnly, NoAccess, NoAccess);
47
48pub trait Access: Copy + Default + private::Sealed {}
50
51pub trait Readable: Access {}
53impl<A: RestrictAccess<ReadOnly, Restricted = ReadOnly>> Readable for A {}
54
55pub trait Writable: Access {}
57impl<A: RestrictAccess<WriteOnly, Restricted = WriteOnly>> Writable for A {}
58
59pub trait Copyable: Access {}
61impl<A: RestrictAccess<ReadOnly, Restricted = Self>> Copyable for A {}
62
63#[derive(Debug, Default, Copy, Clone)]
65pub struct ReadWrite;
66impl Access for ReadWrite {}
67
68#[derive(Debug, Default, Copy, Clone)]
70pub struct ReadOnly;
71impl Access for ReadOnly {}
72
73#[derive(Debug, Default, Copy, Clone)]
75pub struct WriteOnly;
76impl Access for WriteOnly {}
77
78#[derive(Debug, Default, Copy, Clone)]
80pub struct NoAccess;
81impl Access for NoAccess {}
82
83mod private {
84 pub trait Sealed {}
85
86 impl Sealed for super::ReadWrite {}
87 impl Sealed for super::ReadOnly {}
88 impl Sealed for super::WriteOnly {}
89 impl Sealed for super::NoAccess {}
90}