naia_shared/world/delegation/
entity_auth_status.rs

1use naia_serde::SerdeInternal;
2
3use crate::HostType;
4
5#[derive(SerdeInternal, Clone, Copy, Debug, PartialEq, Eq, Hash)]
6pub enum EntityAuthStatus {
7    // as far as we know, no authority over entity has been granted
8    Available,
9    // host has requested authority, but it has not yet been granted
10    Requested,
11    // host has been granted authority over entity
12    Granted,
13    // host has released authority, but it has not yet completed
14    Releasing,
15    // host has been denied authority over entity (another host has claimed it)
16    Denied,
17}
18
19impl EntityAuthStatus {
20    pub fn is_available(&self) -> bool {
21        matches!(self, EntityAuthStatus::Available)
22    }
23
24    pub fn is_requested(&self) -> bool {
25        matches!(self, EntityAuthStatus::Requested)
26    }
27
28    pub fn is_granted(&self) -> bool {
29        matches!(self, EntityAuthStatus::Granted)
30    }
31
32    pub fn is_denied(&self) -> bool {
33        matches!(self, EntityAuthStatus::Denied)
34    }
35
36    pub fn is_releasing(&self) -> bool {
37        matches!(self, EntityAuthStatus::Releasing)
38    }
39}
40
41#[derive(Debug)]
42pub struct HostEntityAuthStatus {
43    host_type: HostType,
44    auth_status: EntityAuthStatus,
45}
46
47impl HostEntityAuthStatus {
48    pub fn new(host_type: HostType, auth_status: EntityAuthStatus) -> Self {
49        Self {
50            host_type,
51            auth_status,
52        }
53    }
54
55    pub fn can_request(&self) -> bool {
56        match (self.host_type, self.auth_status) {
57            (HostType::Client, EntityAuthStatus::Available) => true,
58            (HostType::Client, EntityAuthStatus::Requested) => false,
59            (HostType::Client, EntityAuthStatus::Granted) => false,
60            (HostType::Client, EntityAuthStatus::Releasing) => false,
61            (HostType::Client, EntityAuthStatus::Denied) => false,
62            (HostType::Server, EntityAuthStatus::Available) => todo!(),
63            (HostType::Server, EntityAuthStatus::Requested) => todo!(),
64            (HostType::Server, EntityAuthStatus::Granted) => todo!(),
65            (HostType::Server, EntityAuthStatus::Releasing) => todo!(),
66            (HostType::Server, EntityAuthStatus::Denied) => todo!(),
67        }
68    }
69
70    pub fn can_release(&self) -> bool {
71        match (self.host_type, self.auth_status) {
72            (HostType::Client, EntityAuthStatus::Available) => false,
73            (HostType::Client, EntityAuthStatus::Requested) => true,
74            (HostType::Client, EntityAuthStatus::Granted) => true,
75            (HostType::Client, EntityAuthStatus::Releasing) => false,
76            (HostType::Client, EntityAuthStatus::Denied) => false,
77            (HostType::Server, EntityAuthStatus::Available) => todo!(),
78            (HostType::Server, EntityAuthStatus::Requested) => todo!(),
79            (HostType::Server, EntityAuthStatus::Granted) => todo!(),
80            (HostType::Server, EntityAuthStatus::Releasing) => todo!(),
81            (HostType::Server, EntityAuthStatus::Denied) => todo!(),
82        }
83    }
84
85    pub fn can_mutate(&self) -> bool {
86        match (self.host_type, self.auth_status) {
87            (HostType::Client, EntityAuthStatus::Available) => false,
88            (HostType::Client, EntityAuthStatus::Requested) => true,
89            (HostType::Client, EntityAuthStatus::Granted) => true,
90            (HostType::Client, EntityAuthStatus::Releasing) => false,
91            (HostType::Client, EntityAuthStatus::Denied) => false,
92            (HostType::Server, EntityAuthStatus::Available) => true,
93            (HostType::Server, EntityAuthStatus::Requested) => true,
94            (HostType::Server, EntityAuthStatus::Granted) => true,
95            (HostType::Server, EntityAuthStatus::Releasing) => true,
96            (HostType::Server, EntityAuthStatus::Denied) => true,
97        }
98    }
99
100    pub fn can_read(&self) -> bool {
101        match (self.host_type, self.auth_status) {
102            (HostType::Client, EntityAuthStatus::Available) => true,
103            (HostType::Client, EntityAuthStatus::Requested) => false,
104            (HostType::Client, EntityAuthStatus::Granted) => false,
105            (HostType::Client, EntityAuthStatus::Releasing) => true,
106            (HostType::Client, EntityAuthStatus::Denied) => true,
107            (HostType::Server, EntityAuthStatus::Available) => true,
108            (HostType::Server, EntityAuthStatus::Requested) => true,
109            (HostType::Server, EntityAuthStatus::Granted) => true,
110            (HostType::Server, EntityAuthStatus::Releasing) => true,
111            (HostType::Server, EntityAuthStatus::Denied) => true,
112        }
113    }
114
115    pub fn can_write(&self) -> bool {
116        match (self.host_type, self.auth_status) {
117            (HostType::Client, EntityAuthStatus::Available) => false,
118            (HostType::Client, EntityAuthStatus::Requested) => false,
119            (HostType::Client, EntityAuthStatus::Granted) => true,
120            (HostType::Client, EntityAuthStatus::Releasing) => true,
121            (HostType::Client, EntityAuthStatus::Denied) => false,
122            (HostType::Server, EntityAuthStatus::Available) => true,
123            (HostType::Server, EntityAuthStatus::Requested) => true,
124            (HostType::Server, EntityAuthStatus::Granted) => true,
125            (HostType::Server, EntityAuthStatus::Releasing) => true,
126            (HostType::Server, EntityAuthStatus::Denied) => true,
127        }
128    }
129
130    pub fn status(&self) -> EntityAuthStatus {
131        self.auth_status
132    }
133}