1use crate::error::PostgresGraphError;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7pub enum GraphRole {
8 Reader,
10 Admin,
12}
13
14impl GraphRole {
15 pub const fn satisfies(self, required: Self) -> Result<(), PostgresGraphError> {
25 match (self, required) {
26 (Self::Admin, _) | (Self::Reader, Self::Reader) => Ok(()),
27 (Self::Reader, Self::Admin) => Err(PostgresGraphError::AccessDenied {
28 required,
29 actual: self,
30 }),
31 }
32 }
33
34 pub const fn require(self, required: Self) -> Result<(), PostgresGraphError> {
44 self.satisfies(required)
45 }
46}
47
48#[cfg(kani)]
49mod proofs {
50 use super::GraphRole;
51
52 #[kani::proof]
54 fn admin_satisfies_all() {
55 let admin = GraphRole::Admin;
56 assert!(admin.satisfies(GraphRole::Reader).is_ok());
57 assert!(admin.satisfies(GraphRole::Admin).is_ok());
58 }
59
60 #[kani::proof]
62 fn reader_lattice() {
63 let reader = GraphRole::Reader;
64 assert!(reader.satisfies(GraphRole::Reader).is_ok());
65 assert!(reader.satisfies(GraphRole::Admin).is_err());
66 }
67}